2015-07-03 2 views
1

Эта программа сравнивает две строки: одну, которая является хорошей, и другую, которая вводится пользователем (я сделал это с четырьмя строками, поэтому два из них являются вводом, а два других являются правильными ответами).
Я читал, что функция 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; 
} 
+1

Вы должны скомпилировать все предупреждения & debug info ('gcc -Wall -Wextra -g'), то ** используйте отладчик ** (' gdb') –

ответ

4
fgets(usuario, 5, stdin); 

usuario является указателем и не указывает на какой-либо уважительной ячейку памяти, и вы пытаетесь писать в него, что приведет к непредсказуемому поведению.

Выделите память перед записью в это место.

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

Есть и другие вопросы, которые нужно обращаться как массив должен быть достаточно большим, чтобы держать \0 характер, который не заботиться.

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' 
Смежные вопросы