scanf syntax c
C-Lee una sola int en el momento (3)
Si su entrada es de tamaño fijo como 2015
entonces puede usar
int arr[4];
for(int i=0; i<4; i++){
scanf("%1d", arr+i);
}
Pero para el caso general puede leer como una cadena usando fgets .
Tengo esta entrada:
Entrada: 2015
Y quiero escanearlo así:
scanf("%1d", &arr);
Pero esto definitivamente está mal. ¿Que puedo hacer? Quiero recibir el entero de entrada por entero como ''2'', ''0'', ''1'', ''5'' y no como "2015".
Simplemente lea cada personaje de forma individual y convierta los caracteres individuales en enteros.
#include <stdio.h>
int main(int argc, char* argv[])
{
size_t len, i;
char buff[64];
fgets(buff, sizeof(buff), stdin);
for(i = 0, len = strlen(buff); i < len; ++i) {
int curr = buff[i] - ''0''; /* subtracting ''0'' converts the char to an int */
printf("%d/n", curr);
}
}
Sugiero leer toda la línea, luego analizarla específicamente.
Para leer una línea en los sistemas POSIX use getline (3) , que asignará el buffer de línea en heap (no olvide inicializar el puntero que contiene la línea a NULL
y el tamaño variable a 0, y free
la línea donde ha terminado ) Si tiene mala suerte de estar en un sistema sin getline
, declare un búfer grande (por ejemplo 256 bytes como mínimo) y use fgets (3) . Por cierto, en Linux, para la entrada editable desde la terminal -aka a tty - (no una tubería o un archivo, así que prueba con isatty (3) ) incluso podrías considerar usar readline (3) ; pruébalo una vez, ¡es muy útil!
Una vez que toda la línea está en la memoria, puede analizarla (siempre que haya definido la sintaxis de esa línea, al menos en su cabeza, un ejemplo a menudo no es suficiente, es posible que desee utilizar EBNF en su documentación).
Puede usar sscanf (3) para analizar esa línea o analizarla manualmente con algún código iterativo, etc. No se olvide de verificar el conteo devuelto de los elementos escaneados. Quizás %n
puede ser útil (para obtener un recuento de bytes). También puede analizar esa línea manualmente, o usar strtol (3) para analizar números long
, (o quizás strtok (3) que no me gusta porque es con estado) etc ...