Obtiene () no funciona

Estoy tratando de usar gets() para obtener una cadena del usuario, pero el progtwig parece estar pasando por encima de get gets() . No hay pausa para que el usuario dé entrada. ¿Por qué se gets() no hacer nada?

 char name[13]; printf("Profile name: "); gets(name); printf("\n%s", name); 

Tienes muchos problemas al usar get gets()

En su lugar, vaya para fgets()

 fgets(name,13,stdin); 

Vea esta pregunta SO ¿ Por qué es tan peligrosa la función de obtención que no debería utilizarse?

La razón por la que fgets() no funciona, puede ser que no esté manejando la nueva línea dejada por scanf en sus declaraciones anteriores.

Puede modificar la cadena de formato scanf para tenerlo en cuenta: scanf("%d *[^\n]", &N);

*[^\n] dice que debes ignorar todo después de la entrada de un entero que no sea una nueva línea, pero no hagas nada con la nueva línea (omítelo).

Cuando usas scanf("%d",&num) presionas 13 e enter y 13 se almacena en num y el carácter de newline aún está en el búfer de entrada cuando lees fgets desde stdin , trata \n como los datos que ingresaste y la instrucción fgets() se omite

No puede vaciar el búfer de entrada; sin embargo, puede hacer esto fseek(stdin,0,SEEK_END); Agregue esto antes de cada una de sus declaraciones de fgets.

Se debe a que gets() es tan increíblemente peligroso de usar, que algunas bibliotecas de C lo han eliminado por completo y lo han reemplazado con una versión que no hace nada.

Utilice fgets () en su lugar.

Echa un vistazo a la referencia gets()

Obtener cadena de stdin

Lee los caracteres de la entrada estándar (stdin) y los almacena como una cadena C en str hasta que se alcanza un carácter de nueva línea o el final del archivo.

El carácter de nueva línea, si se encuentra, no se copia en str.

Un carácter nulo de terminación se agrega automáticamente después de los caracteres copiados en str.

Tenga en cuenta que get es bastante diferente de fgets: no solo usa stdin como fuente, sino que no incluye el carácter de nueva línea final en la cadena resultante y no permite especificar un tamaño máximo para str (lo que puede provocar desbordamientos de búfer).

Así que, básicamente, gets() no solo es inseguro (puede provocar desbordamientos de búfer) sino que también lee lo que hay en el búfer de entrada .

Te recomiendo usar fgets() , pero si quieres una solución rápida ( y perezosa y estúpida ), simplemente descarga el búfer de entrada:

 char name[13]; printf("Profile name: "); fflush(stdin); gets(name); printf("\n%s", name); 

Agregue esta función a su código y disfrútela.

 string GetString() { char ch; string Line=""; while(1) { ch=getchar(); if(ch=='\n') break; else Line+=ch; } return Line; } 

¡Esta función puede afectar a todos los espacios y espacios de retroceso también!

Llame a getchar () antes de llamar a gets () o fgets (). Como se omite get () o fgets () debido a un ‘\ n’ ya presente de entradas anteriores en la entrada estándar, llamar a getchar () provocaría que se omitiera en lugar de gets () o fgets () o cualquier otra función similar . Pero recuerde que se trata más de un hack y no de una solución estándar (creo que sí), y también está prohibido el uso de gets ().

  printf("\nEnter a String: "); getchar(); //fgets(inputString, 100, stdin); gets(inputString); printf("\n%s", inputString);