这个程序比较两个字符串:一个是好的,另一个是用户输入的(我用四个字符串做了这个,所以其中两个是输入,另外两个是正确的答案)。 />
我读到不应该使用函数gets
,而是最好使用fgets
。所以,这就是我在这里所做的,但是当我的程序到达第二个printf
时,它崩溃了。
源代码如下所示:
#include <stdio.h>
#include <string.h>
int main()
{
char clave_verdadera[5], usuario_verdadero[5];
strcpy(clave_verdadera, "hola\n");
strcpy(usuario_verdadero, "jose\n");
char *clave, *usuario;
printf("por favor escriba su nombre de usuario:");
fgets(usuario, 5, stdin);
printf("Por favor escriba su contraseña: ");
fgets(clave, 5, stdin);
int comparacion_clave;
comparacion_clave = strcmp(clave, clave_verdadera);
int comparacion_usuario;
comparacion_usuario = strcmp(usuario, usuario_verdadero);
comparacion_clave == 0 && comparacion_usuario == 0
? printf("¡Felicidades! has entrado \n"): printf("Nombre de usuario o contraseña incorrecta \n");
getchar();
return 0;
}
答案 0 :(得分:4)
fgets(usuario, 5, stdin);
usuario
是一个指针,并没有指向任何有效的内存位置,并且您正在尝试写入它,这将导致未定义的行为。
在写入此位置之前分配内存。
usuario = malloc(size);/* size depends on your requirement */
还有其他一些问题需要处理,比如Array应该足够大以容纳\0
字符而不需要处理。
答案 1 :(得分:0)
在您的代码中,
char *clave, *usuario;
它使*clave
和*usuario
指向虚拟地址空间中没有指向任何有效内存(不包含有效地址)的指针,然后通过fgets
尝试修改在该特定(无效)地址位置写入的值,该位置调用未定义的行为。
所以改为,
char *clave = NULL, *usuario = NULL;
并使用malloc
动态分配所需的内存长度。
除此之外,您已在此处声明了这些变量,
char clave_verdadera[5], usuario_verdadero[5];
在fgets(usuario, 5, stdin);
中,您正在将字符串复制到其中,
strcpy(clave_verdadera, "hola\n");
strcpy(usuario_verdadero, "jose\n");
要在char
数组中容纳它,您需要使用它们,
char clave_verdadera[6], usuario_verdadero[6]; //5 for "hola\n" and 1 for '\0'