我想使用包含用户的文本文件执行简单的C登录表单。想法是输入一个用户名,对文件中的每个用户名进行检查,并继续提示输入新的用户名,直到登录成功为止。 文本文件的每一行都有一个用户。
我的问题是,如果我输入第一行以外的任何其他用户,则会收到“登录失败”消息。另外,如果我尝试输入其他用户名,则匹配将始终失败。
#include <stdio.h>
#include <string.h>
int main(){
char loginBuffer[10];
char testuser1[10];
char testuser2[10];
printf("Please provide your username for login\n");
scanf("%s", testuser1);
FILE *loginFile;
loginFile = fopen("users.txt","r");
if(!loginFile){
printf("Could not open file");
return 1;
}
while(fgets(loginBuffer, 7, loginFile) != NULL){
strcpy(testuser2,loginBuffer);
if(strcmp(testuser2, strcat(testuser1,"\n")) == 0){
printf("Login successful, welcome %s \n",testuser1);
break;
}
else{
printf("Login Failed please provide another username\n");
scanf(" %s", testuser1);
}
}
}
答案 0 :(得分:3)
使用fgets
进行所有输入,并避免添加或删除结尾的换行符。
使用标志指示是否找到匹配项。
如果找不到匹配项,则在搜索循环外打印错误。
如果找不到匹配项,请倒带该文件并要求其他用户。
#include <stdio.h>
#include <string.h>
int main(){
char loginBuffer[10];
char testuser1[10];
int found = 0;
FILE *loginFile;
loginFile = fopen("users.txt","r");
if(!loginFile){
printf("Could not open file");
return 1;
}
do {
printf("Please provide your username for login\n");
if ( fgets(testuser1, sizeof testuser1, stdin)) {
found = 0;
do {
if(fgets(loginBuffer, sizeof loginBuffer, loginFile)){
if(strcmp(loginBuffer, testuser1) == 0){
printf("Login successful, welcome %s \n",testuser1);
found = 1;
}
}
else {
break;
}
} while ( !found);
if ( !found) {
printf("Login Failed please provide another username\n");
rewind ( loginFile);
}
}
else {
fprintf ( stderr, "fgets stdin EOF\n");
fclose ( loginFile);
return 0;
}
} while ( !found);
fclose ( loginFile);
}
答案 1 :(得分:0)
尝试一下:
在if(strcmp(testuser2, strcat(testuser1,"\n")) == 0)
行上按if(strcmp(testuser2, strcat(testuser1,"\n")))
进行更改。
将比较值删除为0,因为如果strcmp
返回0,并且满足条件(如果为1),则满足条件。
对我有用