C语言while循环内的if语句始终被跳过,求原因排查
问题:检查文件中特定名称时if语句始终不执行
我尝试使用以下代码检查文件中是否存在与用户输入一致的特定名称,但while循环内的if语句始终被跳过,添加了flag变量及printf语句验证也无任何输出,说明if语句未执行。
原代码:
#include<stdio.h> #include<stdlib.h> #include<string.h> void main(){ FILE *hash; hash = fopen("hash.txt","r"); char name[100], line[100]; char *user; int flag = 0; printf("Enter name: "); fgets(name, 100, stdin); if(hash == NULL){ printf("Error opening file"); exit(1); } while(fgets(line,100,hash)){ user = strtok(line,":"); if(strcmp(user,name)==0){ flag = 1; printf("%d",flag); break; } } }
核心原因及解决办法
输入字符串带换行符,导致匹配失败
fgets读取用户输入时,会把按下的回车(\n)也一并存入name数组末尾;而从文件中读取的行经过strtok(line, ":")拆分后,得到的user是不含换行符的(比如文件行是bob:123,strtok返回bob)。两者用strcmp对比时,因为末尾字符不同,永远不会相等,所以if条件永远不成立。解决:用
strcspn去掉输入字符串末尾的换行符,在fgets之后添加:name[strcspn(name, "\n")] = '\0';代码逻辑优化建议
- 原代码先读取用户输入,再检查文件是否打开失败,若文件打不开,用户白输入了,建议先打开文件并检查,再获取输入。
void main()不符合C标准,应该写成int main()并返回0。- 文件打开后记得用
fclose(hash)关闭,避免资源泄漏。 - 要考虑文件行中没有
:的情况,此时strtok会返回NULL,直接调用strcmp会导致未定义行为,建议先判断user != NULL再对比。
修正后的代码
#include<stdio.h> #include<stdlib.h> #include<string.h> int main(){ FILE *hash; char name[100], line[100]; char *user; int flag = 0; // 先打开文件并校验 hash = fopen("hash.txt","r"); if(hash == NULL){ printf("Error opening file"); exit(1); } printf("Enter name: "); fgets(name, 100, stdin); // 去除输入末尾的换行符 name[strcspn(name, "\n")] = '\0'; while(fgets(line,100,hash)){ user = strtok(line,":"); if(user != NULL && strcmp(user, name) == 0){ flag = 1; printf("%d", flag); break; } } fclose(hash); return 0; }
内容的提问来源于stack exchange,提问作者Overwatch
相关产品推荐
相关产品推荐

