¿Comprobar si la entrada del usuario en una matriz es demasiado larga?

Estoy haciendo que el usuario ingrese 4 números. Se pueden ingresar: 1 2 3 4 o 1234 o 1 2 34, etc. Actualmente estoy usando

int array[4]; scanf("%1x%1x%1x%1x", &array[0], &array[1], &array[2], &array[3]); 

Sin embargo, quiero mostrar un error si el usuario ingresa demasiados números: 12345 o 1 2 3 4 5 o 1 2 345, etc.

¿Cómo puedo hacer esto?

Soy muy nuevo en C, por favor explique lo más posible.

//

Gracias por tu ayuda. Lo que ahora he tratado de hacer es:

 char line[101]; printf("Please input); fgets(line, 101, stdin); if (strlen(line)>5) { printf("Input is too large"); } else { array[0]=line[0]-'0'; array[1]=line[1]-'0'; array[2]=line[2]-'0'; array[3]=line[3]-'0'; printf("%d%d%d%d", array[0], array[1], array[2], array[3]); } 

¿Es esta una forma sensata y aceptable? Se comstack y parece funcionar en Visual Studios. ¿Se comstackrá y correrá en C?

OP está en el camino correcto, pero necesita ajustarse para lidiar con los errores.

El enfoque actual, utilizando scanf() se puede usar para detectar problemas, pero no para recuperarse bien. En su lugar, use una combinación de fgets()/sscanf() .

 char line[101]; if (fgets(line, sizeof line, stdin) == NULL) HandleEOForIOError(); unsigned arr[4]; int ch; int cnt = sscanf(line, "%1x%1x%1x%1x %c", &arr[0], &arr[1], &arr[2],&arr[3],&ch); if (cnt == 4) JustRight(); if (cnt < 4) Handle_TooFew(); if (cnt > 4) Handle_TooMany(); // cnt == 5 

ch atrapa cualquier char no esté en espacios en blanco después de los 4 números.
Utilice %1u si busca 1 dígito decimal en un unsigned .
Use %1d si busca 1 dígito decimal en un int .


OP 2ª array[0]=line[0]-'0'; ... aproximación array[0]=line[0]-'0'; ... array[0]=line[0]-'0'; ... , no está mal, pero tiene algunas deficiencias. No realiza una buena comprobación de errores (no numérica) ni maneja números hexadecimales como el primero. Además, no permite espacios iniciales o intercalados.

Su pregunta puede ser específica del sistema operativo. Estoy asumiendo que podría ser Linux.

Primero puede leer una línea completa con getline (3) (o readline (3) , o incluso fgets (3) si acepta establecer un límite superior para el tamaño de la línea de entrada) y luego analizar esa línea (por ejemplo, con sscanf (3) y use el especificador de formato %n ). No olvide probar el resultado de sscanf (el número de elementos leídos).

Así que tal vez algo como

 int a=0,b=0,c=0,d=0; char* line=NULL; size_t linesize=0; int lastpos= -1; ssize_t linelen=getline(&line,&linesize,stdin); if (linelen<0) { perror("getline"); exit(EXIT_FAILURE); }; int nbscanned=sscanf(line," %1d%1d%1d%1d %n", &a,&b,&c,&d,&lastpos); if (nbscanned>=4 && lastpos==linelen) { // be happy do_something_with(a,b,c,d); } else { // be unhappy fprintf(stderr, "wrong input line %s\n", line); exit(EXIT_FAILURE); } free(line); line=NULL; 

Y una vez que tenga la línea completa, podría analizarla por otros medios, como las llamadas sucesivas de strtol (3) .

Entonces, el problema es qué sucede si el stdin tiene más de una línea. No puedo adivinar lo que quieres en ese caso. Tal vez feof (3) es relevante.

Creo que mi solución puede no ser específica de Linux, pero no lo sé. Probablemente debería funcionar en sistemas operativos compatibles con Posix 2008.

Tenga cuidado con el resultado de sscanf cuando tenga una especificación de conversión %n . La página de manual dice que los estándares pueden ser contradictorios en ese caso de la esquina.

Si su sistema operativo no es compatible con Posix (por ejemplo, Windows), debería encontrar otra forma. Si acepta limitar el tamaño de línea a, por ejemplo, 128, podría codificar

 char line[128]; memset (line, 0, sizeof(line)); fgets(line, sizeof(line), stdin); ssize_t linelen = strlen(line); 

luego agrega el sscanf y el siguiente código del fragmento de código anterior (es decir, el primero) (pero sin la última línea que llama free(line) ).

Lo que está intentando obtener es de 4 dígitos con o sin espacios entre ellos. Para eso, puede tomar una cadena como entrada y luego verificarla carácter por carácter y contar el número de dígitos (y espacios y otros caracteres) en la cadena y realizar la acción deseada / mostrar el mensaje requerido.

No puedes hacer eso con scanf. El problema es que hay formas de realizar una búsqueda de scanf para algo después de los 4 números, pero todos ellos simplemente se sentarán allí y esperarán más entradas del usuario si el usuario NO ingresa más. Así que necesitarías usar gets () o fgets () y analizar la cadena para hacer eso.

Probablemente sería más fácil para usted cambiar su progtwig, de modo que solicite un número a la vez; luego lo hace 4 veces, y ya ha terminado con él, por lo que hay algo en este sentido, en pseudo código:

 i = 0 while i < 4 ask for number scanf number and save in array at index i 

P.ej

 #include  int main(void){ int array[4], ch; size_t i, size = sizeof(array)/sizeof(*array);//4 i = 0; while(i < size){ if(1!=scanf("%1x", &array[i])){ //printf("invalid input"); scanf("%*[^0123456789abcdefABCDEF]");//or "%*[^0-9A-Fa-f]" } else { ++i; } } if('\n' != (ch = getchar())){ printf("Extra input !\n"); scanf("%*[^\n]");//remove extra input } for(i=0;i