程序在printf崩溃

时间:2015-07-03 03:51:23

标签: c crash printf

这个程序比较两个字符串:一个是好的,另一个是用户输入的(我用四个字符串做了这个,所以其中两个是输入,另外两个是正确的答案)。 /> 我读到不应该使用函数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;
}

2 个答案:

答案 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'