c progtwig no funciona scanf char

#include  int main() { struct cerchio c1, c2; float distanza; char k; //input del centro del primo cerchio printf("Enter the coordinate x of the first circle's center: "); scanf("%f", &c1.centro.x); printf("Enter the coordinate y of the first circle's center: "); scanf("%f", &c1.centro.y); //input del raggio del cerchio printf("Enter the circle's radius: "); scanf("%f", &c1.raggio); printf("The first circle's center is: (%.2f, %.2f)\n", c1.centro.x, c1.centro.y); printf("Do you want to move this circle? y/n \n"); //Here is the problem <------------- scanf("%s", &k); if(k=='y'){ moveCircle(&c1); printf("Now the circle's center is: (%.2f, %.2f)\n", c1.centro.x, c1.centro.y); } } 

En el scanf bajo el comentario // aquí está el problema si pongo% c al final del progtwig. La entrada no funciona! Si pongo% s el progtwig funciona perfectamente. ¿Por qué? He declarado la variable k char!

 scanf("%s", &k); 

debiera ser

 scanf(" %c", &k); 

%c es el especificador de formato correcto para un carácter ( char ) mientras que %s se usa para cadenas. El carácter de espacio detrás de %c omite todos los caracteres de espacio en blanco, incluido ninguno, hasta el primer carácter que no sea de espacio en blanco como se especifica en el estándar C11:

7.21.6.2 La función fscanf

[…]

  1. Una directiva compuesta por caracteres de espacios en blanco se ejecuta leyendo la entrada hasta el primer carácter que no está en espacios en blanco (que permanece sin leer), o hasta que no se puedan leer más caracteres. La directiva nunca falla

La razón por la que su progtwig no esperaría más información cuando usó %c es porque existía un carácter de nueva línea ( \n ) en la secuencia de entrada estándar ( stdin ). ¿Recuerda presionar enter después de ingresar los datos para cada scanf ? El carácter de nueva línea no es capturado por el scanf con %f . Este carácter es capturado por el scanf con %c . Es por esto que este scanf no espera más entrada.

En cuanto a por qué su otro scanf s (con un %f ) no consumió \n es porque el %f omite los caracteres de espacio en blanco como se ve en el estándar C11:

7.21.6.2 La función fscanf

[…]

  1. Los caracteres de espacios en blanco de entrada (según lo especificado por la función de isspace ) se omiten, a menos que la especificación incluya un especificador [ , c , o n . 284

En cuanto a por qué su progtwig funcionó cuando lo usó es porque tuvo suerte. Usar %s lugar de %c invoca un comportamiento indefinido . Esto se debe a que %s coincide con una secuencia de caracteres que no son espacios en blanco y agrega un terminador NUL al final. Una vez que un usuario ingresa algo, el primer carácter se almacena en k mientras que el rest de los caracteres (si corresponde) y el \0 se escriben en una ubicación de memoria no válida.

Si actualmente está pensando por qué el especificador de formato %s no consumió el \n es porque omite los espacios en blanco.

utilizar

 scanf(" %c",&k); 

En lugar de

 scanf("%s", &k); // %s is used for strings, Use %c for character variable. 

para la variable char use “% c”. y no olvide mantener el espacio antes de% c " %c" , se omitirán los caracteres de nueva línea y espacios en blanco.