Программа C внезапно завершается после первого ввода при использовании printf()

#c

#c

Вопрос:

Я пробовал этот код, но после ввода первого ввода он завершается. Этот код работает нормально, хотя, когда printf("hello world"); он закомментирован или удален. Компилятор ничего не объясняет и не показывает никаких ошибок, поэтому я не знаю решения. В чем причина этого?

 #include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdbool.h>



bool login(bool logStatus) // takes in loggedIn value
{
    char correctUsername[16] = "admin";
    char correctPassword[16] = "admin123";
    char *inputUsername;
    char *inputPassword;
    int i, checkUsername, checkPassword;


    printf("Enter your username : n");
    fgets(inputUsername, 16, stdin); /* Get user input for username */
    inputUsername[strlen(inputUsername) - 1] = '';
    // scanf("%s", amp;inputUsername);

    printf("Enter your password : n");
    fgets(inputPassword, 16, stdin); /* Get user input for password */
    inputPassword[strlen(inputPassword) - 1] = '';
    // scanf("%s", amp;inputPassword);

    /* Check username and password */
    checkUsername = strcmp(correctUsername, inputUsername);
    checkPassword = strcmp(correctPassword, inputPassword);

    printf("%d %d", checkUsername, checkPassword);

    if (checkUsername == 0 amp;amp; checkPassword == 0)
    {
        printf("nnLogged In Successful");
        logStatus = true;
        return logStatus;
    }
    else
    {
        printf("nnIncorrect username or passwordn");
        printf("Enter any key to continue...");
        getch();
        system("cls");
    }
}

int main()
{
    int input;
    int choice;
    bool loggedIn = false;

    printf("hello world");

    login(loggedIn);

    
    return 0;
}
 

Ответ №1:

inputUsername и inputPassword являются неинициализированными указателями. Затем вы передаете их fgets which пытается разыменовать эти недопустимые указатели. Это вызывает неопределенное поведение.

Сделайте их массивами, подобными имени пользователя / паролю, которые вы проверяете.

 char inputUsername[16];
char inputPassword[16];
 

Комментарии:

1. Спасибо за ответ! Но я хотел бы знать, почему передача функции printf() влияет на нее?

2. @dfakhrizaman Это часть природы неопределенного поведения. Внесение, казалось бы, несвязанных изменений может изменить то, как UB может проявляться.