La función scanf parece ser omitida en c

Soy nuevo en el lenguaje c, y probé este código a continuación, pero parece que se ha omitido scanf. Cuando ejecuto este código, solo me pidió ingresar el nombre y la edad y omitió las líneas debajo de eso, simplemente imprimió el texto en el printf arriba de las oraciones “si”, ¿alguien puede ayudar?

#include void main() { int age; char sex; char name[20]; char status; printf("Enter your last name\n"); scanf("%s", &name); printf("Enter your age\n"); scanf("%d", &age); printf("Enter sex (M/F)\n"); scanf("%c", &sex); printf("your status,married, single,irrelevant (M/S/I)\n"); scanf("%c", &status); if(age>=16 && sex=='M') printf("hello, Mr %s\n", name); if(age<16 && sex =='M') printf("hello, Master %s\n", name); if(sex=='F' && status=='M') printf("hello, Mrs %s\n", name); if(sex=='F' &&(status=='S' ||status=='I')) printf("hello,miss %s\n", name); } 

Cambio

 scanf("%c", &sex); 

a

 scanf(" %c", &sex); ^ space 

y

 scanf("%c", &status); 

a

 scanf(" %c", &status); ^ space 

El problema se debe a los caracteres de nueva línea finales después de su segunda llamada a scanf() . Dado que es de %d tipo especificador, cuando presiona Entrar, se deja un carácter de nueva línea ( '\n' ) en la secuencia y el próximo scanf() intenta leer ese carácter de nueva línea y, por lo tanto, parece que simplemente se saltó de entrada, pero de hecho, lee el carácter de nueva línea.

Por lo tanto, el carácter de nueva línea se almacena en la variable sex y, por lo tanto, omite la solicitud de entrada para esa variable.

Cambia tu código a

 #include int main() { int age; char sex; char name[20]; char status; printf("Enter your last name\n"); // scanf("%s", &name); fgets(name,20,stdin); printf("Enter your age\n"); scanf("%d", &age); printf("Enter sex (M/F)\n"); scanf(" %c", &sex); printf("your status,married, single,irrelevant (M/S/I)\n"); scanf(" %c", &status); if(age>=16 && sex=='M') printf("hello, Mr %s\n", name); if(age<16 && sex =='M') printf("hello, Master %s\n", name); if(sex=='F' && status=='M') printf("hello, Mrs %s\n", name); if(sex=='F' &&(status=='S' ||status=='I')) printf("hello,miss %s\n", name); return 0; } 

Aquí, he agregado un espacio adicional antes del especificador de formato %c , para acomodar cualquier entrada anterior como nueva línea (\ n).
Otro método alternativo es usar getchar() inmediatamente antes de tomar cualquier entrada de caracteres.

Además, si realiza una entrada de cadena con scanf , no leerá la entrada después de encontrar un espacio en blanco. Entonces, en lugar de eso, use fgets para tomar cualquier entrada de cadena que pueda contener espacios.

Otra cosa que cambié en su código (trivial) es int main() y return 0 .

A menos que esté interesado en espacios en blanco como nuevas líneas, no use %c . Simplemente use la conversión de cadena %s y use el primer carácter de la entrada.

Razón scanf : todos los especificadores de conversión de scanf excepto %c ignoran el espacio en blanco, incluidas las nuevas líneas. Están diseñados para leer secuencias de tokens de entrada (números, palabras) donde la cantidad y naturaleza del espacio en blanco es irrelevante. Las palabras pueden estar todas en la misma línea, o cada palabra en una línea diferente; scanf no le importaría a menos que fuerce las lecturas de un solo carácter con %c que casi nunca es necesario.

Puede hacer lo siguiente para todos los scanf s.

 scanf("%c\n",&smth); 

Y luego ingrese los valores uno por uno separándolos por líneas nuevas (presione Entrar ).

Esto también me ayudó cuando tuve el mismo problema.

 scanf("%c*",&smth); 

Eso hace que scanf omita cualquier otro carácter que un usuario pueda ingresar, incluidas las nuevas líneas.


Nota : use las cadenas de formato apropiadas para cada tipo ( %s para cadenas, %d para enteros, etc.).