#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 может проявляться.