【问题标题】:strcmp() doesnt return 0 even both strings are equal即使两个字符串相等,strcmp() 也不返回 0
【发布时间】:2021-04-07 17:44:42
【问题描述】:

我是编程新手,我的任务之一是用 c 构建一个登录系统,其中用户名和密码存储在 .txt 文件中,.txt 文件如下所示

丹尼尔R

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 来匹配来自用户输入和 .txt 文件的用户名和密码,它们都是相等的。我想知道为什么 strcmp() 不返回 0。有什么帮助吗?

【问题讨论】:

  • fgets 将读取 \n 字符并将其附加到字符串中。您需要在比较之前将其剥离。另外我建议使用fgets 进行用户输入,而不是scanf
  • 注意; scanf ("%s",acc1.pass); 不允许空格作为acc1.pass 的一部分,也不能处理长输入。使用fgets()

标签: c newline c-strings fgets


【解决方案1】:

如果目标数组有足够的空间,函数fgets 可以在输入字符串后追加换行符'\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);

注意,至少初始化对象acc1的数据成员会更安全。

例如

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

您应该检查文件是否已成功打开,并且fgets 的调用也是否成功。

【讨论】:

    【解决方案2】:

    阅读fgets 上的文档,它认为新行是有效字符并将它们存储在您的字符串缓冲区中。将字符串的长度减一以抵消它。

    【讨论】:

      猜你喜欢
      • 2011-08-27
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多