¿Cómo leo espacios en blanco usando scanf en c?

Problema: Necesito poder identificar cuando dos espacios en blanco ocurren consecutivamente.

He leído las siguientes preguntas:

cómo leer una cadena de un archivo delimitado \ n

como leer scanf con espacios

Y soy consciente de los problemas de scanf: http://c-faq.com/stdio/scanfprobs.html

La entrada estará en el siguiente formato:

1 5 3 2 4 6 2 1 9 0 

Dos espacios en blanco indican que el siguiente conjunto de datos debe manejarse y compararse a sí mismo. La longitud de la línea es desconocida y el número o los enteros en cada grupo son desconocidos. Dos espacios en blanco es el máximo que separará el siguiente conjunto de datos.

Si bien puedo usar fgets y varias funciones integradas para resolver este problema, estoy en el punto en el que resolver el problema con scanf en este punto probablemente sea más fácil. Sin embargo, si ese no es el caso, usar fgets, strtok y atoi harán la mayor parte del trabajo, pero todavía tengo que identificar dos espacios en blanco seguidos.

Lo siguiente tomará números enteros hasta que se ingrese un número no entero.

 while (scanf ("% d", & x) == 1)

Lo que necesito hacer es leer espacios en blanco también y, si hay dos espacios en blanco consecutivos, el progtwig hará algo diferente con el siguiente conjunto de datos.

Y una vez que tengo un espacio en blanco no sé cómo decir:

 if ((input == "espacio en blanco") && (previousInput == "espacio en blanco"))
   Yada yada
 else (input == "espacio en blanco")
   Yada yada
 más 
   Yada yada

Aprecio tu tiempo y gracias por tu ayuda.

Lección aprendida: aunque Jonathan Leffler publica una solución para scanf a continuación, la solución fue un poco más sencilla con getc (al requerir menos conocimiento íntimo del scanf interno, expresiones regulares y caracteres). En retrospectiva, un mejor conocimiento de las expresiones regulares, scanf y char facilitarían el problema y, por supuesto, sabrían qué funciones están disponibles y cuál habría sido la mejor para usar desde el principio.

getc y ungetc son tus amigos

 #include  int main(void) { int ch, spaces, x; while (1) { spaces = 0; while (((ch = getc(stdin)) != EOF) && (ch == ' ')) spaces++; if (ch == EOF) break; ungetc(ch, stdin); if (scanf("%d", &x) != 1) break; printf("%d was preceded by %d spaces\n", x, spaces); } return 0; } 

Demostración en http://ideone.com/xipm1

Editar Rahhhhhhhhh … Lo subí como C ++. Aquí es exactamente lo mismo, pero ahora C99 strict ( http://ideone.com/mGeVk )

 while ( scanf ( "%c", &x ) == 1 ) 

Usando %c puede leer caracteres de espacio en blanco, solo debe leer todos los datos y almacenar en una matriz. Luego, asigne char* cptr y establezca cptr para comenzar el array, luego analice su array y si quiere leer números decimales, puede usar simplemente sscanf en cptr mientras que quiere leer decimal, pero debe tener el puntero en buena posición en el array (en el número lo que leen)

 if (((*(cptr + 1)) == ' ') && ((*cptr)== ' ')) ya da ya da else ((*cptr)== ' ')) ya da ya da sscanf(++cptr, "%d", &x); else ya da ya da 

Si realmente desea la funcionalidad de tipo scanf , puede usar fgets y sscanf , y use el especificador %n para que scanf le otorgue a su progtwig las compensaciones para el inicio y el final de cada espacio de espacio en blanco al mismo tiempo que realiza el rest de su trabajo. .

De lo contrario, deshacerse de toda la familia scanf . Es posiblemente la parte más inútil de la biblioteca estándar, en mi opinión.

¿Cuál es tu definición de ‘espacio en blanco’?

Francamente, no creo que me gustaría intentar usar scanf() para identificar espacios en blanco dobles; casi cualquier otro método sería mucho más fácil.

Sin embargo, si insistes en hacer lo que no es desesperadamente sensible, entonces es posible que desees utilizar el código derivado de lo siguiente:

 #include  #include  int main(void) { int d; char sp[3] = ""; int n; while ((n = scanf("%d%2[ \t]", &d, sp)) > 0) { printf("n = %d; d = %d; sp = <<%s>>", n, d, sp); if (n == 2 && strlen(sp) == 2) printf(" end of group"); putchar('\n'); } return 0; } 

Los corchetes encierran una clase de caracteres y los 2 antes de que insista en un máximo de 2 caracteres de la clase. Puede que tenga que preocuparse por leer la nueva línea y tratar de obtener más datos para satisfacer la clase de caracteres, lo que podría resolverse eliminando la nueva línea de la clase de caracteres. Pero entonces depende de su definición de espacio en blanco, y si los grupos se terminan automáticamente con una nueva línea o no. No haría daño reiniciar sp[0] = '\0'; al final del bucle.

Quizás sea mejor invertir los campos para detectar dos espacios antes de un número. Pero eso fallaría en el caso ordinario, por lo tanto, debería recurrir a un formato simple "%d" para leer el número (y si eso falla, sabe que no obtuvo espacios ni un error de número). Tenga en cuenta que %d reduce el espacio en blanco inicial (según lo define la norma), todos ellos.

Cuanto más lo veo, menos me gusta ‘ scanf() solamente. Recuérdame que no tome clases en tu universidad, por favor.

Aquí hay una solución que usa solo la función scanf (). Usé sscanf () en este ejemplo para aproximadamente la misma funcionalidad.

 #include  int p_1_cnt = 0, p_2_cnt = 0; void process_1(int x) { p_1_cnt++; } void process_2(int x) { p_2_cnt++; } char * input_line = "1 5 3 2 4 6 2 1 9 0"; int main(void) { char * ip = input_line; int x = 0, ws_0 = 0, ws_1 = 0, preceding_spaces = 1, fields = -2; while (sscanf (ip, "%d%n %n", &x, &ws_0, &ws_1) > 0) { ip += ws_0; if ((preceding_spaces) == 1) process_1(x); else process_2(x); preceding_spaces = ws_1 - ws_0; } printf("\np_1_cnt = %d, p_2_cnt = %d", p_1_cnt, p_2_cnt); _fgetchar(); return 0; }