使用fgets过滤换行符时条件判断失效问题排查
问题原因与修复方案
1. 条件判断逻辑完全写反了
你用了||逻辑或,意思是只要不是"\n"或者不是"\r"就执行拷贝——但换行符只会是其中一种,所以这个条件永远为真,换行符根本跳不过。要改成&&逻辑与,也就是既不是"\n"也不是"\r"的时候才拷贝。
另外,字符串字面量"\n"本身末尾就带\0,不用多此一举写"\n\0",直接用strcmp(verif, "\n")就行。
2. 更简单的实现方式:用fgetc读单个字符
fgets是用来读字符串的,你只需要单个字符,用fgetc更直接,还能避免字符串比较的麻烦:
修复后的完整代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char words[4][4][2]; int c; // 用int存fgetc的返回值,能识别EOF int i = 0, j = 0, lin = 4, col = lin; printf("Insert numbers: "); while (i < lin) { c = fgetc(stdin); // 跳过换行符和回车符 if (c == '\n' || c == '\r') { continue; } // 遇到EOF就停止(比如输入结束) if (c == EOF) { break; } // 把字符存入数组,手动加字符串结束符 words[i][j][0] = c; words[i][j][1] = '\0'; j++; // 列数满了就切换到下一行 if (j >= col) { j = 0; i++; } } printf("\n"); for (i = 0; i < lin; i++) { for (j = 0; j < col; j++) { printf("-%s\t", words[i][j]); } printf("\n"); } return 0; }
3. 如果坚持用fgets的修改方案
只需要把原来的if条件改成下面这样就行,但这种方式会存在“读取字符和换行符分成两次fgets调用”的问题,不如fgetc逻辑清晰:
if (strcmp(verif, "\n") != 0 && strcmp(verif, "\r") != 0)
内容的提问来源于stack exchange,提问作者gettingAway
相关产品推荐
相关产品推荐

