2010-10-26 36 views
5

scanf ("% s", str) no lo hará. Dejará de leer en el primer espacio. gets (str) tampoco funciona cuando la cadena es grande. ¿Algunas ideas?¿Cómo puedo leer una cadena con espacios en C?

+2

'gets' nunca funciona. Es un error inherente a usar 'gets'. Use 'fgets'. –

+0

Tal vez es mi versión de c que no aceptará para nada ... ¡Gracias! – Johny

+0

@Johnny: la advertencia de R contra el uso de 'gets()' se debe al hecho de que su uso introduce un * gran * agujero de seguridad en el código, no que su compilador en particular tenga un problema (no debería; 'obtiene() 'ha sido parte de la C desde el principio). Ha quedado obsoleto a partir de C99 y ya no se debe usar. –

Respuesta

13

use fgets con STDIN como la transmisión de archivos. Luego puede especificar la cantidad de datos que desea leer y dónde ubicarlos.

+0

en realidad es así: – Johny

+0

fgets (str1, 100, stdin); fgets (str2, 100, stdin); No me pedirán la primera cadena. Va directamente al segundo. Gracias por la rápida respuesta. – Johny

+0

No estoy seguro de lo que significa su comentario, ¿algo no funciona? –

1

¿Cuándo quieres dejar de leer? En EOF, en un personaje específico, o qué?

Puede leer un número determinado de caracteres con% c

c ajusta con una secuencia de anchura count caracteres (por defecto 1); el siguiente puntero debe ser un puntero a char, y debe haber suficiente espacio para todos los caracteres (no se agrega NUL de terminación). Se omite el omisión habitual de de espacios en blanco iniciales. Para omitir primero el espacio en blanco , use un espacio explícito en el formato.

Usted puede leer caracteres específicos (o hasta excluidos) con% [

[detecta una secuencia no vacía de caracteres del conjunto especificado de caracteres aceptados; el siguiente puntero debe ser un puntero a char, y debe haber suficiente espacio para todos los caracteres en la cadena , más un carácter NUL de terminación. Se omite la omisión habitual del espacio blanco blanco. La cadena debe estar compuesta por los caracteres en (o no) en un conjunto particular; el conjunto está definido por los caracteres entre el corchete abierto [carácter y un corchete cerrado] charac- ter. El conjunto excluye esos caracteres si el primer carácter después del corchete abierto es una circunfleja ^. Para incluir un soporte cerrado en el conjunto, conviértalo en el primer personaje después del soporte abierto o circunflejo; cualquier otra posición terminará el conjunto. El carácter de guión: también es especial; cuando se coloca entre dos caracteres , agrega todos los caracteres intermedios al conjunto. Para incluir un guion, hágalo el último carácter antes del paréntesis final. Por ejemplo, `[^] 0-9-] 'significa el conjunto ` `todo excepto cerrar corchete, cero a nueve y guión' '. La cadena de termina con la aparición de un carácter que no es (o, con un cumflex cir- , en) establecido o cuando la anchura del campo se queda sin

+0

Simplemente no quiero espacios en blanco entre la cuerda. Intenté scanf ("% [^ \ n]", str); pero tampoco funcionó. ¡Gracias de cualquier manera! – Johny

+0

¿Quiere leer una línea completa? –

+0

Supongo, pero eso significa hasta 79 caracteres, ¿verdad? Necesito una cuerda que puede ser más grande. – Johny

2

Cree su propia función para leer una línea. Esto es lo que básicamente tiene que hacer:

 
1. fgets into allocated (growable) memory 
2. if it was a full line you're done 
3. grow the array 
4. fgets more characters into the newly allocated memory 
5. goto 2. 

La implementación puede ser un poco complicado :-)

Es necesario pensar acerca de lo que necesita para pasar a la función (por lo menos la dirección de la matriz y su tamaño); y qué devuelve la función cuando todo "funciona" o cuando hay un error.Debe decidir qué es un error (¿es una cadena de 10 Gbytes de largo sin '\ n' un error?). Debe decidir cómo hacer crecer la matriz.


Editar

En realidad, puede ser mejor para fgetc en lugar de fgets

 
get a character 
it it EOF? DONE 
add to array (update length), possible growing it (update size) 
is it '\n'? DONE 
repeat 
1

Para leer cadena con el espacio que puede hacer de la siguiente manera:

char name[30],ch; 

i=1; 
while((ch=getchar())!='\n') 
{ 
name[i]=ch; 
i++; 
} 
i++; 
name[i]='\n'; 
printf("String is %s",name); 
+0

'ch' debe ser' int' para distinguir 'EOF' de todos los demás' char'. Como está ahora, 'while ((ch = getchar())! = '\ N')' es un bucle infinito en caso de que 'EOF' se devuelva de' getchar() '. – chux

4
char str[100]; 

Prueba este

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

o esta

fgets(str, sizeof str, stdin)) 
+0

1) No hay razón para 's' en' "% [^ \ n] s" '. 2) 'scanf ("% [^ \ n] ... 'no escaneará nada y no guardará nada en' str' si la entrada es '" \ n "'. 3) 'scanf ("% [^ \ n] .. .' no protege contra entradas grandes. 4) 'scanf ("% [^ \ n] ... 'deja' '\ n'' en 'stdin'. – chux

Cuestiones relacionadas