【问题标题】:Program crashes at printf程序在 printf 处崩溃
【发布时间】:2015-07-03 03:51:22
【问题描述】:

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

【问题讨论】:

  • 您应该使用所有警告和调试信息 (gcc -Wall -Wextra -g) 进行编译,然后使用调试器 (gdb)

标签: c crash printf


【解决方案1】:
fgets(usuario, 5, stdin);

usuario 是一个指针,没有指向任何有效的内存位置,而您正在尝试写入它,这将导致未定义的行为。

在写入此位置之前分配内存。

usuario = malloc(size);/* size depends on your requirement */

还有其他问题需要处理,例如数组应该足够大以容纳未处理的\0 字符。

【讨论】:

    【解决方案2】:

    在您的代码中,

    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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 2014-11-02
      相关资源
      最近更新 更多