#include <stdio.h>
#include <string.h>
#include <stdbool.h>
void tampilan_awal()
{
int angka_daerah;
do {
printf("Daerah\n.....................................\n1. Daerah\n");
printf("Ketik angka 1 jika ingin memilih daerah yang dituju dan angka 0 jika tidak ingin melanjutkan!\n"); //Click 1 if you wanna choose destination(daerah) you wanna go and click 0 if you don't want to continue
scanf("%i", &angka_daerah);
if(angka_daerah == 1)
{
pilihdaerahutama();
} else if(angka_daerah == 0)
{
break;
}
} while (angka_daerah != 1 && angka_daerah != 0);
}
void daftar_akun_database() {
FILE *filePointer;
char username[30];
char password[30];
// Buka file untuk menulis
filePointer = fopen("filename.txt", "a");
printf("Buat username dan password\n");
printf("Username: ");
fgets(username, sizeof(username), stdin);
clearBuffer();
printf("Password: ");
fgets(password, sizeof(password), stdin);
clearBuffer();
// Menghapus karakter newline dari username dan password
strtok(username, "\n");
strtok(password, "\n");
fprintf(filePointer, "Username: %s\nPassword: %s\n", username, password);
fclose(filePointer);
filePointer = fopen("filename.txt", "r");
fseek(filePointer, 0, SEEK_SET);
check_database();
}
void clearBuffer() {
int c;
while ((c = getchar()) != '\n' && c != EOF);
}
void check_database() {
FILE *filePointer;
char username[50];
char line[50];
char password[50];
bool found = false;
int punya_akun;
// Buka file untuk membaca
filePointer = fopen("filename.txt", "r");
// Periksa keberhasilan pembukaan file
if (filePointer == NULL) {
printf("Gagal membuka file.\n");
return 1;
}
// Meminta pengguna untuk memasukkan username dan password
printf("Masukkan username dan password\n");
printf("Masukkan username: ");
fgets(username, sizeof(username), stdin);
clearBuffer();
strtok(username, "\n"); // Menghapus newline
printf("Masukkan password: ");
fgets(password, sizeof(password), stdin);
clearBuffer();
strtok(password, "\n"); // Menghapus newline
// Loop untuk membaca setiap baris dari file
while (fgets(line, sizeof(line), filePointer) != NULL) {
// Menghapus karakter newline dari setiap baris
strtok(line, "\n");
// Memeriksa apakah username dan password ada dalam baris
if (strstr(line, "Username: ") != NULL && strstr(line, username) != NULL &&
fgets(line, sizeof(line), filePointer) != NULL && // Membaca baris Password
strstr(line, "Password: ") != NULL && strstr(line, password) != NULL) {
printf("Username dan password benar!\n");
found = true;
tampilan_awal();
}
}
if(!found)
{
printf("Username tidak dapat ditemukan silahkan coba lagi.\n");
do{
printf("Sudah punya akun? Silahkan ketik 1 untuk daftar dan 2 untuk coba lagi: ");
scanf("%i", &punya_akun);
if(punya_akun == 1)
{
daftar_akun_database();
} else{
check_database();
}
} while(punya_akun != 1 && punya_akun != 2);
}
fclose(filePointer);
}
int main()
{
check_database();
return 0;
}
我不知道我的代码出了什么问题:(,讲师没有正确地教授 f gets 和 gets 函数,他们做得太仓促了。他们推荐我使用 gets,而我只知道 f gets 因为我在w3schools学习。有人可以给我正确的代码以及我做错的地方吗?我很无能,截止日期是明天(我们必须在网上提交)
我尝试输入用户名和密码,但文件上根本没有用户名。像这样 用户名: 密码:1234
我认为这与 fgets 和函数clearBuffer 有关,但我不知道哪里出了问题。函数clearBuffer刚刚创建了一些新空间,就像我们转到check_database函数一样,它显示如下 用户名:1234(输入) (进入) 密码:5678(输入) (输入)
我不明白发生了什么,有人可以向我解释一下吗???
在
check_database()
中,您读取了带有 fgets()
的行,该行消耗了尾随的 \n
。然后你调用 clearBuffer()
,它将阻塞 getchar()
直到使用 Ctrl-D 关闭流以生成 EOF,因为流中没有留下 \n
。使用 clearBuffer()
读取字符串后不要调用 fgets()
。
strtok(username, "\n")
没有做任何事情。去除尾随换行符的一种方法是:
username[strcspn(username, "\n")] = '\0';