2010-08-24 7 views

Respuesta

13

¿Es

scanf("%[^\t\n]",string); 
+0

@subhashis: ¿hay alguna posibilidad de aceptar esto si cumplió con la intención original? – Chubsdad

+0

Si la entrada comienza con ''\ t'' o'' \ n'' como '" \ t123 456 "', nada se lee en 'cadena'. – chux

3

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

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

Tenga en cuenta que este es un gran agujero de seguridad, ya que un usuario puede entrar fácilmente en una cadena que es más largo que el espacio asignado.

Si no conoce el número de palabras, puede que tenga que reformular su pregunta. ¿Para qué lo necesitas leer? ¿Por qué no quieres usar gets(), por qué tiene que ser scanf()?

+1

Por supuesto 'get' es su propia laguna de seguridad también, y uno debería usar' fgets' en su lugar. –

+6

no existe una "gran laguna de seguridad" si utiliza el conocido parámetro scanf-format como "scanf ("% 99s% 99s ", str1, str2)" – user411313

+0

Gracias Gordon, no sabía sobre el campo de ancho del formateador . Pero, ¿cómo se manejarán las palabras con> 99 caracteres? ¿Los caracteres están descartados correctamente, o permanecerán en el búfer de entrada y causarán que falle el siguiente formateador? –

1

Se podía leer una línea completa de un archivo si desea con:

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

Ahora, usted podría utilizar sscanf para obtener cada palabra:

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

"línea" y "palabra" son punteros de char.

Observe cómo va la línea para llegar a la siguiente palabra.

+0

'scanf ("% [^ \ n] \ n ", línea);' ** no ** siempre leerá una línea completa. No guarda nada en 'line', la entrada es' "\ n" 'y el' '\ n'' permanecerá en 'stdin'. 'sscanf (línea,"% s ", palabra);' no guardará nada en 'word' si' line' solo está compuesto por espacios en blanco. – chux

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

Aquí [^\n indica que scanf() mantendrá recibir caracteres en name[ ] hasta que se encuentre una \n.

+3

No hay necesidad de 's' en' scanf ("% [^ \ n] s", nombre); '. – chux

2

Mejor usado fgets() que scanf() para leer una línea de entrada del usuario.

Si el código debe utilizar scanf() continuación

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 PARSE buf de palabras individuales.

1
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); 

Este escaneo resultados en campo1 que contienen "Pan", que contiene campo2 "leche", ... Field6 que contiene "cookies". Entre la primera y la última palabra puede incluir uno o más espacios en blanco o pestañas Las cookies de finalización siguientes pueden ser una de las tres de espacio, pestaña o línea nueva que se eliminarán y no serán parte de "cookies".

Cuestiones relacionadas