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?
Respuesta
use fgets con STDIN como la transmisión de archivos. Luego puede especificar la cantidad de datos que desea leer y dónde ubicarlos.
¿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
Simplemente no quiero espacios en blanco entre la cuerda. Intenté scanf ("% [^ \ n]", str); pero tampoco funcionó. ¡Gracias de cualquier manera! – Johny
¿Quiere leer una línea completa? –
Supongo, pero eso significa hasta 79 caracteres, ¿verdad? Necesito una cuerda que puede ser más grande. – Johny
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
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);
'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
char str[100];
Prueba este
scanf("%[^\n]s",str);
o esta
fgets(str, sizeof str, stdin))
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
- 1. ¿Cómo puedo leer una cadena con scanf() en C++?
- 2. leyendo una cadena con espacios con sscanf
- 3. ¿Cómo creo una cadena de espacios en blanco en C++?
- 4. reemplazando espacios en una cadena con guiones
- 5. bash: leer texto de una cadena de un carácter a la vez, con espacios en blanco
- 6. ¿Cómo puedo leer desde una cadena XML en OpenCV?
- 7. ¿Cómo puedo crear una cadena en C# mediante programación?
- 8. Separar una cadena por espacios en blanco en C++
- 9. Separar una cadena por espacios
- 10. .NET Formatee una cadena con espacios fijos
- 11. ¿Cómo puedo crear una cadena con comillas en C#
- 12. ¿Cómo elimino espacios repetidos en una cadena?
- 13. ¿Cómo puedo leer/cargar imágenes en C++?
- 14. Separar una cadena con múltiples espacios
- 15. cómo leer el nombre de propiedad con espacios en java
- 16. ¿cómo puedo leer datos binarios en C++?
- 17. Dividir una cadena con múltiples espacios en blanco con perl?
- 18. ¿Cómo puedo rellenar parte de una cadena con espacios, en Perl?
- 19. ¿Cómo leer y escribir una cadena STL C++?
- 20. cómo se divide una cadena con una cadena en C#
- 21. Eliminar espacios de una cadena
- 22. En C#, ¿cómo puedo leer una cadena de conexión almacenada en mi cadena de conexión de archivos web.config?
- 23. Leer salto de línea en una cadena con JavaScript
- 24. Eliminar espacios de una cadena en VB.NET
- 25. ¿Cómo puedo dividir una cadena con un delimitador de cadena?
- 26. Encontrar espacios dobles en una cadena - Python
- 27. Cómo combinar cadena [] a cadena con espacios entre
- 28. Reemplazar todos los espacios en una cadena con +
- 29. Cómo reemplazo todos los espacios con% 20 en C#
- 30. Leer una cadena línea por línea usando C++
'gets' nunca funciona. Es un error inherente a usar 'gets'. Use 'fgets'. –
Tal vez es mi versión de c que no aceptará para nada ... ¡Gracias! – Johny
@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. –