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

如何用C语言读取CSV首字段?基于fscanf的查找函数问题求助

问题分析与解决方案

首先,你的代码出现问题主要有两个核心原因:错误的循环终止条件和fscanf格式字符串不匹配CSV的结构。咱们一步步拆解并修复:

原代码的问题点

  1. !feof(csvFile)作为循环条件:这是C语言处理文件的常见误区。feof()只有在尝试读取超过文件末尾时才会返回真,意味着最后一次循环会执行无效读取,可能引发段错误或错误匹配。
  2. fscanf("%s%*[^,]", word)的格式错误:
    • %s会读取到第一个空白字符,虽然能拿到姓名,但后续的%*[^,]会尝试读取所有非逗号字符——此时下一个字符是逗号,格式匹配失败,fscanf返回值仅为1(只成功读取了%s部分),导致后续读取位置混乱,甚至读到错误内容。

修复后的代码

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

void find_name(const char *csv_filename, const char *name){
    FILE *csvFile = fopen(csv_filename, "r");
    // 预留1位给字符串终止符,避免缓冲区溢出
    char word[1000];
    if (csvFile == NULL) {
        perror("Failed to open file");
        exit(EXIT_FAILURE);
    }
    // 用fscanf返回值判断读取是否成功,替代feof的错误用法
    // %999[^,]:最多读999个非逗号字符到word,适配数组大小
    // ,:匹配姓名后的逗号
    // %*[ \n]:读取并丢弃空格、换行符,处理逗号后的空格与换行
    while (fscanf(csvFile, "%999[^,],%*[ \n]", word) == 1) {
        if (strcmp(word, name) == 0) {
            printf("Name found: %s\n", word);
        }
    }
    fclose(csvFile);
}

关键细节解释

  • %999[^,]:限制最大读取字符数为999,刚好适配word[1000]的容量(最后一位留给\0),避免缓冲区溢出;[^,]表示读取所有非逗号字符,完美匹配CSV第一个字段(姓名)的边界。
  • ,%*[ \n]:%*[ \n]中的*代表“读取但不存储”,[ \n]匹配空格和换行符,能跳过姓名后的逗号、空格,以及换行符,确保下一次读取直接定位到下一行的姓名。
  • 用fscanf返回值控制循环:fscanf成功读取一个字段时返回1,文件读完或读取失败时返回小于1的值,精准终止循环,避免无效读取。

测试验证

用你提供的CSV内容测试:

Jake, 25, Montreal
Maria, 32, London
Alex, 19, New York
Jake, 22, Dubai

调用find_name("your_file.csv", "Jake")会输出两次Name found: Jake,完全符合预期。

内容的提问来源于stack exchange,提问作者Sami

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:51:48