Cómo tomar espacios en blanco en la entrada en C

Quería tomar la matriz de caracteres de la consola y también incluye espacios en blanco, el único método que conozco en C es scanf, pero no deja de tomar la entrada una vez que llega al espacio en blanco. ¿Qué debería hacer?

Esto es lo que estoy haciendo.

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

Trate de usar fgets (). Leerá una línea completa de un flujo de su elección (stdin, supongo que está buscando). Un ejemplo para su caso:

 char address[100]; fgets(address, 100, stdin); 

fgets () leerá a lo sumo la cantidad de caracteres pasados ​​en el segundo argumento (menos uno). No hay desbordamiento de búfer, y obtendrá toda la línea hasta e incluyendo un carácter de nueva línea (o hasta EOF). Tenga en cuenta que dado que un número máximo de caracteres para leer es uno de los parámetros, es posible que obtenga una línea parcial. Verifique si el último carácter en la cadena devuelta es ‘\ n’, y sabrá que tiene una línea completa. La detección de EOF es bastante sencilla también; un valor de retorno NULL y un cheque a errno deberían ayudarlo.

Gracias a Chris (abajo), por el punto sobre líneas parciales.

Puedes probar algo como esto:

 char str[100]; scanf("%99[0-9a-zA-Z ]s", str); printf("%s\n", str); 

Hay maneras de hacerlo con scanf() , pero en mi humilde opinión, se ponen feos rápidamente. El patrón común (que, sorprendentemente, aún no se ha mencionado) es leer la cadena con fgets() y luego usar sscanf() para procesarla. sscanf() funciona como scanf() , solo que en lugar de procesar el flujo de entrada estándar, procesa una cadena que se le pasa (de la misma manera que se relacionan printf() y sprintf() ). Los basicos:

 char s[100], str[100]; int i, x; fgets(s, 100, stdin); if(sscanf(s, "%d %x %s", &i, &x, str) != 3) { // our three variables weren't all set - probably an invalid string // either handle the error or set default values here. } 

Ver fgets()

fgets() lee a lo sumo uno menos que los caracteres de tamaño de la secuencia y los almacena en el búfer señalado por s. La lectura se detiene después de un EOF o una nueva línea. Si se lee una nueva línea, se almacena en el búfer. Un ‘\ 0’ se almacena después del último carácter en el búfer.

 char *fgets(char *s, int size, FILE *stream); 

Más detalles disponibles en muchas preguntas de SO, por ejemplo input-string-through-scanf .

(Debido a la demanda popular, se eliminó la referencia a gets() )

Personalmente usaría fgets, pero eso ya se ha señalado aquí. Una forma de hacerlo usando scanf sería

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

Esto incluye todos los caracteres hasta que se encuentra un ‘\ n’.

Si desea ingresar datos hasta una nueva línea utilizando una matriz dinámica dentro de la estructura, esto puede ser útil:

 #include #include struct student{ char *name; }; int main() { struct student s; s.name = malloc(sizeof(char *)); printf("Name: "); // fgets(s.name, 10, stdin); // this would limit your input to 10 characters. scanf("%[^\n]", s.name); printf("You Entered: \n\n"); printf("%s\n", s.name); } 

Mi estilo.

  #include  #define charIsimUzunlugu 30 struct personelTanim { char adSoyad[charIsimUzunlugu]; } personel; printf(" your char : "); scanf("%[^\n]",personel.adSoyad); printf("\n\n%s",personel.adSoyad);