entrada de cadena de palabras múltiples a través de scanf ()

¿Cuál fue la syntax para ingresar cadenas con más de una palabra, es decir, con espacio en medio a través de scanf () no se obtiene ()

Lo es

scanf("%[^\t\n]",string); 
 char name[50]; printf("Enter your full name: "); scanf("%[^\n]s",name); 

Aquí [^\n indica que scanf( ) seguirá recibiendo caracteres en name[ ] hasta que se encuentre un \n .

No creo que esto sea posible con scanf (). Si conoce el número de palabras que desea leer, puede leerlo con

 char str1[100], str2[100]; scanf("%s %s", str1, str2); 

Tenga en cuenta que esta es una gran laguna de seguridad, ya que un usuario puede ingresar fácilmente una cadena más larga que el espacio asignado.

Si no sabe el número de palabras, es posible que tenga que reformular su pregunta. ¿Para qué necesitas leerlo? ¿Por qué no quieres usar gets (), por qué tiene que ser scanf ()?

Es mejor utilizar fgets() que scanf() para leer una línea de entrada del usuario.

Si el código debe usar scanf() entonces

 char buf[100]; // Read up to 99 char and then 1 \n int count = scanf("%99[^\n]%*1[\n]", buf); if (count == EOF) { Handle_EndOfFile(); // or IO error } if (count == 0) { // Input began with \n, so read and toss it scanf("%*c"); } 

Ahora analiza buf para palabras individuales.

Puedes leer una línea completa de un archivo si lo deseas con:

 scanf("%[^\n]\n", line); 

Ahora, puedes usar sscanf para obtener cada palabra:

 sscanf(line, "%s", word); line += strlen(word) + 1; 

“línea” y “palabra” son punteros de caracteres.

Fíjate en qué línea va hacia la siguiente palabra.

  char field1[40]; char field2[40]; char field3[40]; char field4[40]; char field5[40]; char field6[40]; /* * sscanf( workarea, format, field of pointers ) * Interpret [^ ] as a field ending in a blank * Interpret [^' '] as a field ending in a blank * Interpret [^ |\t] as a field ending in blank or tab char * Interpret [^' '|\t] as a field ending in blank or tab char * Interpret [^ |\t\n] as a field ending in blank, tabchar or end-of-line * */ strcpy(workarea,"Bread milk eggs cheese tomatoes cookies \n"); i=sscanf(workarea," %[^' '|\t] %[^[' '|\t] %[^' '|\t] %[^' '|\t] %[^' '|\t] %[^' '|\t|\n] ", field1,field2,field3,field4,field5,field6); 

Los resultados de este escaneo son field1 que contiene “Bread”, field2 que contiene “milk”, … field6 que contiene “cookies”. Entre la primera y la última palabra puede uno o más espacios en blanco o tabs. El final de las siguientes cookies puede ser uno de los tres espacios, tabulación o nueva línea que se eliminarán y no formarán parte de las “cookies”.