You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:36:40