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

C语言中scanf无法读取CSV全部整数的问题排查与解决

嘿,我来帮你搞定这个CSV读取的问题!

问题出在哪儿?

你的while(scanf("%d", &otherNum)==1)循环只执行一次,核心原因是CSV文件的逗号分隔符干扰了scanf的整数匹配。

scanf("%d")只会识别连续的数字字符,当它读完第一个整数后,输入流里紧接着的是逗号(比如CSV里的123,456),逗号不属于数字的一部分,这时候scanf会直接匹配失败,返回值不是1,循环就直接终止了。而当你改成每行一个整数时,换行符属于scanf会自动跳过的空白字符,所以每次都能顺利读到下一个整数,循环自然正常运行。

适配CSV的解决方案

下面给你几种不同场景下的解决方案,你可以根据自己的需求选:

方案1:读完整数后跳过分隔符(简单直接)

思路是每次读取整数后,手动跳过后面的逗号、换行或空格这些分隔符,让下一次scanf能直接读到下一个整数:

#include <stdio.h>
#include <ctype.h> // 需要包含这个头文件用isspace

int main() {
    int count = 0;
    int otherNum;
    int c;

    while (scanf("%d", &otherNum) == 1) {
        count++;
        printf("%d\n", otherNum);
        
        // 跳过逗号、换行、空格这类分隔符
        while ((c = getchar()) != EOF && (c == ',' || isspace(c))) {
            // 空循环,只是跳过这些字符
        }
        
        // 如果不是文件末尾,把刚读到的非分隔符字符放回输入流
        if (c != EOF) {
            ungetc(c, stdin);
        }
    }
    printf("整数总数量:%d\n", count);
    return 0;
}

方案2:让scanf直接匹配逗号(代码更简洁)

可以修改scanf的格式字符串,让它同时匹配整数和后面的逗号,最后再单独处理没有逗号的末尾整数:

#include <stdio.h>

int main() {
    int count = 0;
    int otherNum;

    // 先处理所有带逗号后缀的整数
    while (scanf("%d,", &otherNum) == 1) {
        count++;
        printf("%d\n", otherNum);
    }
    
    // 处理最后一个没有逗号的整数
    if (scanf("%d", &otherNum) == 1) {
        count++;
        printf("%d\n", otherNum);
    }
    printf("整数总数量:%d\n", count);
    return 0;
}

这个方法代码更短,但要注意如果CSV最后一行末尾有多余的逗号(比如123,456,),那空字段会被自动忽略,不会计入统计,这也符合CSV的规范。

方案3:逐行读取后拆分(应对复杂CSV)

如果你的CSV可能有更复杂的情况(比如整数前后有空格、存在空字段等),逐行读取再拆分字符串的方式会更健壮:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main() {
    char line[1024];
    int count = 0;
    int num;

    // 逐行读取文件
    while (fgets(line, sizeof(line), stdin) != NULL) {
        char *ptr = line;
        // 拆分当前行的所有逗号分隔字段
        while (*ptr != '\0') {
            // 跳过字段前的空白字符
            while (isspace((unsigned char)*ptr)) ptr++;
            
            // 尝试从当前位置读取整数
            if (sscanf(ptr, "%d", &num) == 1) {
                count++;
                printf("%d\n", num);
                // 跳到当前整数的末尾
                while (isdigit((unsigned char)*ptr)) ptr++;
            } else {
                // 如果不是整数,直接跳到下一个逗号或行尾
                while (*ptr != '\0' && *ptr != ',') ptr++;
            }
            
            // 跳过逗号,准备处理下一个字段
            if (*ptr == ',') ptr++;
        }
    }
    printf("整数总数量:%d\n", count);
    return 0;
}

这个方法能处理像 123 , 456 ,,,789这类带空格、空字段的CSV,兼容性更强。

内容的提问来源于stack exchange,提问作者M.A.G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:59:16