簡體   English   中英

即使兩個字符串相等,strcmp() 也不返回 0

[英]strcmp() doesnt return 0 even both strings are equal

我是編程新手,我的任務之一是在 c 中構建一個登錄系統,其中用戶名和密碼存儲在 .txt 文件中,.txt 文件如下所示

丹尼爾

77 天

(上面是用戶名,下面是密碼)

問題是當我使用 strcmp() 比較用戶輸入和用戶名和密碼的 .txt 文件中的兩個字符串時,即使兩個字符串相等,它也不會返回 0

#include <stdio.h)
#include <conio.h>
#include <string.h>
#include <stdlib.h>

struct login 
{
char name[25];
char pass[25];
};
void login()
{
struct login acc1,acc2;
printf("input your username : ");
scanf ("%s",acc1.name);
printf("input your password : ");
scanf ("%s",acc1.pass);
FILE* fp = fopen("account.txt","r");
fgets(acc2.name,25,fp);
fgets(acc2.pass,25,fp);
if (strcmp(acc1.name,acc2.name)==0 && strcmp(acc1.pass,acc2.pass)==0)
{
printf("login successful\n");
}
else
{
printf("wrong password or username");
}

我什至嘗試使用 printf 來匹配來自 userinput 和 from.txt 文件的用戶名和密碼,它們都是相等的。 我想知道為什么 strcmp() 不返回 0。有什么幫助嗎?

如果目標數組有足夠的空間,function fgets可以 append 輸入字符串與換行符'\n'

您需要將其刪除。

例如,您可以通過以下方式執行此操作

acc2.name[ strcspn( acc2.name, "\n" ) ] = '\0';
acc2.pass[ strcspn( acc2.pass, "\n" ) ] = '\0';

在這些電話之后

fgets(acc2.name,25,fp);
fgets(acc2.pass,25,fp);

請注意,至少初始化 object acc1的數據成員會更安全。

例如

struct login acc1 = { .name = "", .pass = "" };
struct login acc2;

並且您應該檢查文件是否已成功打開並且fgets的調用也是否成功。

閱讀有關fgets的文檔,它認為新行是有效字符並將它們存儲在您的字符串緩沖區中。 將字符串的長度減一以抵消它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM