在 C 语言中,strcmp() 在应该返回 0 时却没有返回 0

问题描述 投票:0回答:1

我正在比较用户输入的用户名和密码。正在比较的字符串是从文件中读取的。无论出于何种原因,它都会适当地比较用户名,而不是密码。

#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

用户名/密码不匹配!!!

c comparison fgets strtok strcmp
1个回答
0
投票

fgets
读取一行文本时,它还会读取并存储该行末尾的换行符。

这意味着,当您使用

strtok
分割字符串并使用
" "
作为分隔符时,读入的密码会包含换行符,而用户通过
scanf
%s
格式说明符读取的密码则不会包含换行符。不,导致不匹配。

您可以通过在给予

strtok
的分隔符集中包含换行符来解决此问题。

char *token = strtok(arr[i], " \n");
...
token = strtok(NULL, " \n");
© www.soinside.com 2019 - 2024. All rights reserved.