¿Lectura de cadena de entrada con carácter de espacio?

Estoy usando Ubuntu y también estoy usando Geany y CodeBlock como mi IDE. Lo que trato de hacer es leer una cadena (como "Barack Obama" ) y ponerla en una variable:

 #include  int main(void) { char name[100]; printf("Enter your name: "); scanf("%s", name); printf("Your Name is: %s", name); return 0; } 

Salida:

 Enter your name: Barack Obama Your Name is: Barack 

¿Cómo puedo hacer que el progtwig lea el nombre completo?

Utilizar:

 fgets (name, 100, stdin); 

100 es la longitud máxima del búfer. Debe ajustarlo según su necesidad.

Utilizar:

 scanf ("%[^\n]%*c", name); 

El [] es el carácter del escaneo. [^\n] dice que mientras la entrada no es una nueva línea ( '\n' ) toma entrada. Luego, con %*c lee el carácter de nueva línea del búfer de entrada (que no se lee) y * indica que esta lectura en la entrada se descarta (supresión de tareas), ya que no la necesita, y esta nueva línea en el el búfer no crea ningún problema para las siguientes entradas que pueda tomar.

Lea aquí sobre el scanset y los operadores de supresión de tareas .

Tenga en cuenta que también puede usar gets pero ….

Nunca use gets() . Debido a que es imposible decir sin conocer los datos de antemano cuántos caracteres obtiene () leerá, y porque gets() continuará almacenando caracteres más allá del final del búfer, es extremadamente peligroso de usar. Se ha utilizado para romper la seguridad informática. Use fgets() lugar.

Prueba esto:

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

\n simplemente establece el delimitador para la cadena escaneada.

Aquí hay un ejemplo de cómo puede obtener entradas que contengan espacios usando la función fgets .

 #include  int main() { char name[100]; printf("Enter your name: "); fgets(name, 100, stdin); printf("Your Name is: %s", name); return 0; } 
 scanf(" %[^\t\n]s",&str); 

str es la variable de la cual obtienes la cadena.

 #include int main() { char name[100]; printf("Enter your name: "); scanf("%[^\n]s",name); printf("Your Name is: %s",name); return 0; } 

NOTA: Cuando se utiliza fgets (), el último carácter de la matriz será ‘\ n’ cuando use fgets () para entradas pequeñas en CLI (intérprete de línea de comando), al terminar la cadena con ‘Enter’. Entonces, cuando imprime la cadena, el comstackdor siempre irá a la siguiente línea cuando imprima la cadena. Si desea que la cadena de entrada tenga un comportamiento similar a una cadena con terminación nula, use este truco simple.

 #include int main() { int i,size; char a[100]; fgets(a,100,stdin);; size = strlen(a); a[size-1]='\0'; return 0; } 

Actualización: actualizada con la ayuda de otros usuarios.

Usando este código puede tomar entrada hasta presionar enter de su teclado.

 char ch[100]; int i; for (i = 0; ch[i] != '\n'; i++) { scanf("%c ", &ch[i]); } 
 #include  // read a line into str, return length int read_line(char str[]) { int c, i=0; c = getchar(); while (c != '\n' && c != EOF) { str[i] = c; c = getchar(); i++; } str[i] = '\0'; return i; } 

"%s" leerá la entrada hasta que se scope el espacio en blanco.

get puede ser un buen lugar para comenzar si quieres leer una línea (es decir, todos los caracteres, incluidos los espacios en blanco hasta que se llegue a un carácter de nueva línea).

“Barack Obama” tiene un espacio entre ‘Barack’ y ‘Obama’. Para acomodar eso, use este código;

 #include  int main() { printf("Enter your name\n"); char a[80]; gets(a); printf("Your name is %s\n", a); return 0; } 

La respuesta correcta es esta:

 #include  int main(void) { char name[100]; printf("Enter your name: "); // pay attention to the space in front of the % //that do all the trick scanf(" %[^\n]s", name); printf("Your Name is: %s", name); return 0; } 

Ese espacio delante del% es muy importante, porque si tiene en su progtwig otros pocos escaneos, digamos que tiene 1 escaneo de un valor entero y otro escaneo con un valor doble … cuando llegue al escaneo de su char (cuerda nombre) ese comando se omitirá y no podrá ingresar valor para él … pero si pone ese espacio delante de% estará bien todo y no saltará nada.

Si bien los métodos mencionados anteriormente funcionan, pero cada uno tiene su propio tipo de problemas.

Puede usar getline() o getdelim() , si está utilizando la plataforma compatible con posix. Si está utilizando Windows y Minigw como su comstackdor, entonces debería estar disponible.

getline() se define como:

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

Para tomar entrada, primero necesita crear un puntero al tipo de letra.

 #include  #include // s is a pointer to char type. char *s; // size is of size_t type, this number varies based on your guess of // how long the input is, even if the number is small, it isn't going // to be a problem size_t size = 10; int main(){ // allocate s with the necessary memory needed, +1 is added // as its input also contains, /n character at the end. s = (char *)malloc(size+1); getline(&s,&size,stdin); printf("%s",s); return 0; } 

Entrada de muestra: Hello world to the world!

Salida: Hello world to the world!\n

Una cosa a tener en cuenta aquí es que, aunque la memoria asignada para s es de 11 bytes, cuando el tamaño de entrada es de 26 bytes, getline reasigna s utilizando realloc() .

Por lo tanto, no importa cuánto tiempo su entrada sea.

size se actualiza con no.de bytes leídos, según el size entrada de muestra anterior será 27 .

getline() también considera \n como entrada. Así que su ‘s’ tendrá ‘\ n’ al final.

También hay una versión más genérica de getline() , que es getdelim() , que toma otro argumento adicional, que es el delimiter .

getdelim() se define como:

ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);

Página de manual de Linux

Si necesita leer más de una línea, necesita borrar el búfer. Ejemplo:

 int n; scanf("%d", &n); char str[1001]; char temp; scanf("%c",&temp); // temp statement to clear buffer scanf("%[^\n]",str); 
 scanf("%s",name); 

usar & con entrada scanf