Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

332
Vistas
¿Cuál es la forma correcta de usar scanf_s al usar matrices de cadenas?
char array1[10]; scanf_s("%9s", array1, (unsigned)_countof(array1);

¿Qué significa (unsigned)_countof(array1) ?

y ¿cuál es la diferencia con use scanf_s("%9s", array1, sizeof(array1); ?

ambos funcionaron, pero quiero entenderlo con más seguridad

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

sizeof y _countof son diferentes. (editar:) En este caso, debe usar countof .

sizeof es un operador en C que devuelve el tamaño de memoria ocupado por una variable, en bytes. En este caso, array1 es una matriz de 10 caracteres, por lo que su tamaño es diez veces el tamaño de char y sizeof(char) es 1 byte. Entonces el valor de sizeof(array1) es 10 * 1 = 10 bytes.

Tenga en cuenta que en C puede usar sizeof en cualquier variable (por ejemplo sizeof(array1) ) o en cualquier tipo (por ejemplo sizeof(int) ).

_countof es una macro (solo disponible en plataformas de Microsoft) que le brinda la cantidad de elementos declarados en una variable de matriz. En este caso, su variable array1 tiene 10 elementos, por lo que _countof(array1) será 10.

Ahora , en su caso preciso, este es el mismo resultado porque el tamaño de cada char es 1, pero esto no sería lo mismo si, por ejemplo, su variable fuera una matriz de int s.

 int array2[10]; sizeof(array2); // = 40 _countof(array2); // = 10

Un int (normalmente) tiene 4 bytes, por lo que una matriz de 10 int s tendrá un tamaño de 10*4 = 40 bytes. Por otro lado, _countof solo contará cuántos elementos se declaran en la matriz y aún devolverá 10.

De hecho, podemos ver que la definición de _countof es literalmente sizeof(array) dividido por sizeof(array[0]) , es decir, el tamaño de un elemento individual.

Dado que scanf_s con "%s" espera una cantidad de elementos, debe usar _countof . (editar).

También es posible que desee tener cuidado con sizeof (y _countof ) en matrices y evitar usarlos en punteros. También tenga en cuenta que _countof no funcionará fuera de Visual Studio. Vea estas respuestas relacionadas .

over 4 years ago · Santiago Trujillo Denunciar

0

¿Cuál es la forma correcta de usar scanf_s al usar matrices de cadenas?

scanf_s() con "%9s" no es para matrices de cadenas . Es para leer texto y guardarlo como una sola cadena , que es una matriz de caracteres con un carácter nulo .

Su uso adecuado se complica porque MSVC espera un tipo diferente en el argumento de recuento que C11. En C11 y posteriores, scanf_s() es una función opcional de la biblioteca estándar y carece de amplia aceptación.

 // MSVC - type unsigned expected, hence the cast. scanf_s("%9s", array1, (unsigned)_countof(array1); // C11 - type size_t expected scanf_s("%9s", array1, sizeof array1 / sizeof array1[0]);

El uso adecuado de cualquiera de los códigos obliga a comprobar el valor de retorno de scanf_s()

 if (1 == scanf_s("%9s", ...)) Success(); else Fail();

¿Qué significa (unsigned)_countof(array1) ?

_countof() es una macro MSVC equivalente a (sizeof(array) / sizeof(array[0])) . Cuando se pasa una matriz, devuelve el recuento de elementos de la matriz como tipo size_t . La conversión a unsigned obtiene el tipo esperado como con scanf_s() . El valor puede truncarse debido a la conversión, un problema poco común con matrices grandes.


qué es diferente de use scanf_s("%9s", array1, sizeof(array1)); ?

El tipo esperado de sizeof(array1) es size_t y no está unsigned como se esperaba en MSVC, lo que genera un comportamiento indefinido . Cuando size_t es como unsigned , está bien, de lo contrario, es un problema real.

El valor conceptual es incorrecto. Debería ser el número de elementos de la matriz, no el tamaño en bytes de la matriz. Está bien aquí como sizeof(char)==1 , pero está mal si el código se movió para decir usando caracteres anchos.


ambos trabajaron

El código no es portátil. Puede haber "funcionado" en el caso de OP, pero carece de portabilidad.


Considere alternativas a scanf_s(), scanf() como fgets() .

over 4 years ago · Santiago Trujillo Denunciar

0

Esta pregunta está basada en el compilador, GCC 11.1.0 on Arch Linux no tiene funciones como scanf_s y _countof . Estas funciones/macros pueden ser válidas en Windows.

Leí algunos documentos en documentos de Microsoft . Entonces, _countof es una macro que llama internamente a sizeof() y scanf_s es similar a scanf en C17 estándar.

¿Qué significa (sin signo) _countof (array1)? y ¿qué es diferente de use scanf_s("%9s", array1, sizeof(array1);? ambos funcionan, pero quiero entenderlo con más seguridad

Aquí la macro _countof está contando la longitud de la matriz almacenada en la pila , que en este caso es 10 .

La macro _countof se expande a:

 #define _countof(x) (sizeof(x) / sizeof(x[0])) // the operation goes for `array1` like this: // 10 * 1 byte / 1 byte // 1 byte is the sizeof char // hence, 10 is returned as the result of the above operation

Y (unsigned) es simplemente escribir el valor de la operación anterior.

NOTA: Como _countof está llamando a sizeof() , no use esto dentro de una función para obtener la longitud de una matriz. Porque sizeof(arr_ptr) devolverá el tamaño del puntero, que en mi caso es de 8 bytes (arquitectura x86_64) .

Conclusión:

No hay _countof solo llamando a sizeof() . Me gustaría sugerirle que use las funciones sizeof y scanf porque son multiplataforma y portátiles a través de los estándares C.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda