我正在比较用户输入的用户名和密码。正在比较的字符串是从文件中读取的。无论出于何种原因,它都会适当地比较用户名,而不是密码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int MAX_SIZE = 100;
int main()
{
FILE *fp;
char *filename = "userdata.txt";
char arr[100][MAX_SIZE];
//open for writing
fp = fopen(filename, "r");
//verify open
if(fp == NULL)
{
printf("%s does not exist", filename);
return 0;
}
int index = 0;
//read file into array
while(fgets(arr[index], MAX_SIZE, fp) != NULL)
{
index++;
}
//username input
char username[100];
printf("Username: ");
scanf("%s", username);
//password input
char password[100];
printf("Password: ");
scanf("%s", password);
int check1 = 0;
int check2 = 0;
int x;
for (int i = 0 ; i<index ; i++)
{
char *token = strtok(arr[i], " ");
while (token != NULL)
{
x = strcmp(token,username);
printf("%d\n",x);
printf("%s %s\n",token,username);
if(!strcmp(token,username))
{
check1 = 1;
}
token = strtok(NULL, " ");
x = strcmp(token,username);
printf("%d\n",x);
printf("%s %s\n",token,password);
if(!strcmp(token,username))
{
check2 = 1;
}
token = strtok(NULL, " ");
if(check1&&check2)
{
printf("The amount is: %s\n",token);
return 0;
}
token = strtok(NULL, " ");
check1=0;
check2=0;
}
}
printf("Username/Password mismatch!!!\n");
return 0;
}
控制台输出--------------------------------------------
用户名:user1
密码:密码1
0
用户1 用户1
-5
密码1 密码1
1
用户2 用户1
-5
密码2 密码1
2
用户3 用户1
-5
密码3 密码1
3
用户4 用户1
-5
密码4 密码1
4
用户5 用户1
-5
密码5 密码1
5
用户6 用户1
-5
密码6 密码1
用户名/密码不匹配!!!
当
fgets
读取一行文本时,它还会读取并存储该行末尾的换行符。
这意味着,当您使用
strtok
分割字符串并使用 " "
作为分隔符时,读入的密码会包含换行符,而用户通过 scanf
和 %s
格式说明符读取的密码则不会包含换行符。不,导致不匹配。
您可以通过在给予
strtok
的分隔符集中包含换行符来解决此问题。
char *token = strtok(arr[i], " \n");
...
token = strtok(NULL, " \n");