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
相关产品推荐
相关产品推荐

