Escanear un espacio en blanco / línea entera en c

Entonces, sé que esta pregunta se ha hecho antes, pero parece que no puedo hacer que nada funcione. Lo que tengo ahora es esto:

#include struct ClothingCustomer{ char name[20]; int age; double inseam; }; struct ClothingCustomer createACustomer(){ struct ClothingCustomer aCustomer; printf("Enter Customer Name: "); scanf("%s",aCustomer.name); printf("Age: "); scanf("%d",&aCustomer.age); printf("Inseam: "); scanf("%lf",&aCustomer.inseam); return aCustomer; }; int main(){ FILE* customersFile = fopen("customers.txt","w"); for (int i = 0; i < 5; i++){ struct ClothingCustomer aCustomer = createACustomer(); fprintf(customersFile, "%s %d %lf\n", aCustomer.name, aCustomer.age, aCustomer.inseam); } fclose(customersFile); return 0; } 

No importa lo que haga para tratar de hacer que escanee más de una palabra, como un nombre / apellido o algo así, funciona, pero esto es lo que obtengo en la consola mientras ejecuto esto (con las opciones de escaneo para tratar de superar un espacio en blanco que se indica a continuación; el código anterior funciona correctamente, pero no permite el espacio en blanco):

 Enter Customer Name: Age: Inseam: Enter Customer Name: Age: Inseam: Enter Customer Name: Age: Inseam: Enter Customer Name: Age: Inseam: Enter Customer Name: Age: Inseam: 

¿Cómo puedo hacer que no haga esto? He intentado usar:

 [^\n] fgets(name, sizeof(name), stdin); 

Y lo mismo sucede cada vez.

Esto funcionará

  #include #include struct ClothingCustomer createACustomer(void); struct ClothingCustomer{ char name[20]; int age; double inseam; }; struct ClothingCustomer createACustomer(void){ struct ClothingCustomer aCustomer; { //From Here Starts The Part in Which You Are Having Problems. char c; int i; printf("Enter Customer Name: "); scanf("%s",aCustomer.name); i = strlen(aCustomer.name); // length of user input till first space do{ scanf("%c", &c); aCustomer.name[i++] = c; // reading characters after first space (including it) }while (c != '\n'); // until user hits Enter aCustomer.name[i - 1] = 0; // string terminating } printf("Age: "); scanf("%d",&aCustomer.age); printf("Inseam: "); scanf("%lf",&aCustomer.inseam); return aCustomer; }; int main(){ FILE* customersFile = fopen("customers.txt","w"); int i = 0; for (i = 0; i < 5; i++){ struct ClothingCustomer aCustomer = createACustomer(); fprintf(customersFile, "%s %d %lf\n", aCustomer.name, aCustomer.age,aCustomer.inseam); } fclose(customersFile); return 0; } 

Le recomiendo que eche un vistazo a esta respuesta , le ayudará mucho. El método que utilicé aquí se menciona en la respuesta anterior. Dé crédito a esa respuesta si este método funciona para usted. Aquí está la explicación de la parte en la que tenía problemas, cómo está funcionando ahora.

¿Cómo funciona esto? Cuando el usuario ingresa caracteres de la entrada estándar, se almacenarán en una cadena variable hasta el primer espacio en blanco. Después de eso, el rest de la entrada permanecerá en el flujo de entrada y esperará el próximo escaneo. Luego, tenemos un bucle for que toma char por char desde el flujo de entrada (till \ n) y los agrega al final de la variable de cadena, formando así una cadena completa igual a la entrada del usuario desde el teclado.

No está claro por qué scanf(" %19[^\n], aCustomer.name) falló para OP.

En lugar de usar scanf() para entradas complejas, separe las entradas del usuario del análisis. Abandone el uso de scanf() completamente y use fgets() para obtener la entrada del usuario. Utilice sscanf() , strtod() , strtol() , strtok() etc. para analizar.

Asegúrese de verificar el resultado de la entrada del usuario y el éxito de las funciones de análisis.

OP no ha indicado cómo manejar la entrada problemática. Lo que aparece a continuación devuelve un cliente de ropa de cero en ese caso. Códigos de error adicionales o mensajes de error pueden ser útiles.

 struct ClothingCustomer createACustomer(void) { // Suggest initializing struct ClothingCustomer zero = { 0 }; struct ClothingCustomer aCustomer = { 0 }; char buffer[100]; printf("Enter Customer Name: "); fflush(stdout); // insure prompt is seen before asking for input if (fgets(buffer, sizeof buffer, stdin) == NULL) return zero; buffer[strcspn(buffer, "\r\n")] = '\0'; // lop off potential line ending if (strlen(buffer) >= sizeof aCustomer.name) return zero; // too long strcpy(aCustomer.name, buffer); printf("Age: "); fflush(stdout); if (fgets(buffer, sizeof buffer, stdin) == NULL) return zero; if (sscanf(buffer, "%d", &aCustomer.age) != 1) return zero; // Let us do some range checking // https://en.wikipedia.org/wiki/List_of_the_verified_oldest_people if (aCustomer.age < 0 || aCustomer.age > 122) return zero; printf("Inseam: "); fflush(stdout); if (fgets(buffer, sizeof buffer, stdin) == NULL) return zero; if (sscanf(buffer, "%lf", &aCustomer.inseam) != 1) return zero; return aCustomer; }