¿Por qué get () no está funcionando?

Estoy progtwigndo en C en Unix, y uso para leer las entradas del teclado. Siempre recibo esta advertencia y el progtwig deja de ejecutarse:

 warning: this program uses gets(), which is unsafe. 

¿Alguien puede decirme la razón por la que esto está sucediendo?

Como se mencionó en las respuestas anteriores, use fgets lugar de gets .

Pero no es que gets no funcione, es muy inseguro. Supongo que tiene un error en su código que también aparecería con fgets , así que por favor publique su fuente.

EDITAR Basado en la información actualizada que proporcionó en su comentario, tengo algunas sugerencias.

  • Recomiendo buscar un buen tutorial de C en su idioma nativo, Google es su amigo aquí. Como libro recomendaría el lenguaje de progtwigción C

  • Si tiene nueva información, es una buena idea editarla en su publicación original, especialmente si se trata de un código, facilitará que la gente entienda lo que quiere decir.

  • Está intentando leer una cadena, básicamente una matriz de caracteres, en un solo carácter, que por supuesto fallará. Lo que quieres hacer es algo como lo siguiente.

     char username[256]; char password[256]; scanf("%s%s", username, password); 

    Siéntase libre de comentar / editar, estoy muy oxidado incluso en C básico.

EDITAR 2 Como advirtió jamesdlin, el uso de scanf es tan peligroso como se gets .

gets no es seguro porque le das un búfer, pero no le dices qué tan grande es el búfer. La entrada puede escribir más allá del final del búfer, haciendo explotar su progtwig de manera bastante espectacular. Usar fgets cambio es un poco mejor porque le dices qué tan grande es el búfer, así:

 const int bufsize = 4096; /* Or a #define or whatever */ char buffer[bufsize]; fgets(buffer, bufsize, stdin); 

… así que siempre que le des la información correcta, no pasa del final del búfer y explota las cosas.

Un poco OT, pero

No es necesario que use una const int para el tamaño del búfer, pero le recomiendo que no solo coloque un número literal en ambos lugares, porque inevitablemente cambiará uno pero no el otro más adelante. El comstackdor puede ayudar:

 char buffer[4096]; fgets(buffer, (sizeof buffer / sizeof buffer[0]), stdin); 

Esa expresión se resuelve en tiempo de comstackción, no en tiempo de ejecución. Es un problema escribir, así que solía usar una macro en mi conjunto de encabezados habituales:

 #define ARRAYCOUNT(a) (sizeof a / sizeof a[0]) 

… pero estoy un poco desactualizado con mi C pura, probablemente haya una mejor manera en estos días.

man gets dice:

Nunca use gets (). Debido a que es imposible saber sin saber de antemano la cantidad de caracteres que leerá () y porque () continuará almacenando caracteres más allá del final del búfer, es extremadamente peligroso de usar. Se ha utilizado para romper la seguridad informática. Utilice fgets () en su lugar.

gets () no es seguro. Se necesita un parámetro, un puntero a un búfer de caracteres. Pregúntese qué tan grande tiene que hacer ese búfer y cuánto tiempo puede escribir un usuario sin presionar la tecla de retorno.

Básicamente, no hay manera de evitar un desbordamiento de búfer con get () – use fgets ().