¿Leer una cadena de entrada con carácter de espacio? [duplicar]

Resuelto Hieu Nguyen asked hace 13 años • 13 respuestas

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

#include <stdio.h>

int main(void)
{
    char name[100];

    printf("Enter your name: ");
    scanf("%s", name);
    printf("Your Name is: %s", name);

    return 0;
}

Producción:

Enter your name: Barack Obama
Your Name is: Barack

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

Hieu Nguyen avatar Jun 08 '11 23:06 Hieu Nguyen
Aceptado

Usar:

fgets (name, 100, stdin);

100es la longitud máxima del búfer. Debes ajustarlo según tus necesidades.

Usar:

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

Es []el carácter del conjunto de escaneo. [^\n]dice que mientras la entrada no sea una nueva línea ( '\n'), tome la entrada. Luego con %*clee el carácter de nueva línea del buffer de entrada (que no se lee), y indica *que esta lectura en la entrada se descarta (supresión de asignación), ya que no la necesita, y esta nueva línea en el buffer no crea cualquier problema para las próximas entradas que pueda tomar.

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

Tenga en cuenta que también puede utilizar getspero...

Nunca usar gets(). Debido a que es imposible saber sin conocer los datos de antemano cuántos caracteres leerá get(), y debido a que gets()continuará almacenando caracteres más allá del final del búfer, su uso es extremadamente peligroso. Se ha utilizado para violar la seguridad informática. Úselo fgets()en su lugar.

phoxis avatar Jun 08 '2011 16:06 phoxis

Prueba esto:

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

\nsimplemente establece el delimitador de la cadena escaneada.

Sridhar Iyer avatar Jun 08 '2011 16:06 Sridhar Iyer

La respuesta correcta es esta:

#include <stdio.h>

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 de % es muy importante, porque si tienes en tu programa otros cuantos scanf digamos que tienes 1 scanf de valor entero y otro scanf con valor doble... cuando llegues al scanf de tu char (string nombre) ese comando se omitirá y no podrá ingresar un valor para él... pero si coloca ese espacio delante de% todo estará bien y no se omitirá nada.

Cristian Babarusi avatar Sep 24 '2017 13:09 Cristian Babarusi

A continuación se muestra un ejemplo de cómo puede obtener entradas que contengan espacios utilizando la fgetsfunción.

#include <stdio.h>

int main()
{
    char name[100];
    printf("Enter your name: ");
    fgets(name, 100, stdin); 
    printf("Your Name is: %s", name);
    return 0;
}
kyle k avatar Sep 02 '2013 00:09 kyle k