c - 为什么我不能比较文件中的那些数组并且我读取这些数组以创建登录系统?
问题描述
该strcmp()
功能不工作。我从控制台读取的用户名与文件中的用户名不匹配。所以,输出是错误的id。解决办法是什么?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
FILE *pass;
char str[100],str2[100];
char id[100],pw[100];
pass=fopen("password.txt","r");
printf("ENTER USER NAME AND PASSWORD:\n");
printf("USERNAME: ");
gets(id);
printf("\nPASSWORD: ");
gets(pw);
while(fgets(str,100,pass)!=NULL);
{
fgets(str2,100,pass);
if(strcmp(id,str)==0)
{
if(strcmp(pw,str2)==0)
{
printf("ACCEPTED\n");
}
else
{
printf("wrong password");
}
}
else
{
printf("wrong id");
}
}
fclose(pass);
}
解决方案
首先,永远不要使用gets()
,永远使用fgets()
。
也就是说fgets()
,读取尾随换行符并将其存储到目标缓冲区中。
来自C11
,第 7.21.7.2 章
该
fgets
函数最多从stream指向的流中读取比n指定的字符数少一个的字符到s指向的数组中。在换行符(保留)之后或文件结尾之后不会读取其他字符。在读入数组的最后一个字符之后立即写入一个空字符。
在使用扫描的值之前,您应该摆脱该换行符。这是实现这一目标的一种方法。
推荐阅读
- c# - 在托管服务中使用时,asp.net core AppSettings 失败
- python - h5py 查看器无法打开它/以编程方式调用
- marklogic - Marklogic 二级排序如何工作?
- python-3.x - 如何将数据列表(括号中的每个值)转换为 python 列表形式?
- actions-on-google - AndroidTV 上的 Google 助理不显示表格
- angular - (Angular 2/4/5/6)更改浏览器后退按钮的导航
- sql-server - SQL Server:从调用其他存储过程的存储过程中捕获临时表
- python - 在 DjangoModelFactory 中使用 Django faker 创建的克隆模型字段
- javascript - TypeScript 针对错误的 ECMAScript 版本
- firebase-realtime-database - firebase 功能 INVALID_ARGUMENT HTTP 错误 400 在部署