使用strcmp比较不同长度字符数组未匹配,如何正确结合fgets使用?
fgets读取字符串后strcmp不匹配的问题分析与解决
问题原因
你输入"Pedro"后,fgets()会将输入的字符串**连同换行符\n**一起写入test数组,此时test中存储的是"Pedro\n\0",而name数组里是"Pedro\0"。两者内容存在差异,strcmp()自然不会返回0。
解决方法
核心是移除fgets()读取到的换行符,以下是两种常用方式:
方式一:使用strcspn()快速处理
strcspn()会返回字符串开头到第一个指定字符的长度,利用这一点可以直接定位换行符并替换为字符串结束符\0:
fgets(test, 25, stdin); // 移除换行符 test[strcspn(test, "\n")] = '\0'; if(!strcmp(name, test)) puts("They are equal...");
方式二:使用strchr()查找并替换
先通过strchr()查找换行符的位置,存在则替换为\0,逻辑更直观:
fgets(test, 25, stdin); char *newline = strchr(test, '\n'); if (newline != NULL) { *newline = '\0'; } if(!strcmp(name, test)) puts("They are equal...");
额外注意事项
- 建议先判断
fgets()的返回值,处理读取失败(比如遇到EOF)的情况:if (fgets(test, 25, stdin) == NULL) { // 读取失败,可根据需求做错误处理 return 1; } - 如果输入的字符串长度超过
fgets()指定的最大可读长度(这里是24,需留一位给\0),换行符不会被读入,此时上述代码也不会出错——strcspn()会返回字符串长度,替换位置就是原有的\0,不会破坏字符串结构。
内容的提问来源于stack exchange,提问作者Pedro Luiz
相关产品推荐
相关产品推荐

