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

如何在C语言中查找name.txt文件内各学生姓名的位置

解决C语言读取name.txt并查找每个姓名位置的问题

你的现有代码存在几个关键问题,导致无法实现提取姓名并记录位置的需求:

  • 未初始化char c;,第一次循环判断c != EOF时会使用随机值,逻辑直接出错。
  • 每次循环重置i=0,仅存储单个字符,根本没法拼接完整姓名。
  • 没有区分每行的姓名,也完全没记录每个姓名的位置信息。

针对你的需求,这里提供修正后的代码,实现读取文件中每个姓名,并输出其行号和在文件中的起始偏移位置:

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

int main() {
    FILE *fp;
    char line[100]; // 存储整行内容
    long position; // 记录姓名在文件中的起始偏移
    int line_num = 0;

    // 打开文件并检查是否成功
    fp = fopen("name.txt", "r");
    if (fp == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 逐行读取文件内容
    while (fgets(line, sizeof(line), fp) != NULL) {
        line_num++;
        // 计算当前行的起始位置(fgets会移动指针,所以用当前位置减去行长度回推)
        position = ftell(fp) - strlen(line);
        
        // 提取姓名:跳过行首的数字和括号(比如"1)"、"10)")
        char *name_start = strchr(line, ')');
        if (name_start != NULL) {
            name_start++; // 跳过')'字符
            // 去除姓名末尾的换行和多余空格
            char *end = name_start + strlen(name_start) - 1;
            while (end >= name_start && (*end == '\n' || *end == ' ')) {
                *end = '\0';
                end--;
            }
            printf("行号:%d,起始位置:%ld,姓名:%s\n", line_num, position, name_start);
        }
    }

    fclose(fp);
    return 0;
}

代码说明:

  • 用fgets逐行读取,比逐个字符处理更高效,也方便记录行号。
  • 通过ftell获取文件指针位置,计算出当前行在文件中的起始偏移量。
  • 用strchr定位行中的')',以此分割行号和姓名部分,再清理姓名末尾的空格和换行符,得到干净的姓名内容。
  • 直接输出每个姓名对应的行号、文件起始位置和姓名本身。

对应你的name.txt的测试输出:

运行代码后会得到如下结果:

行号:1,起始位置:0,姓名:Liam
行号:2,起始位置:7,姓名:Olivia
行号:3,起始位置:15,姓名:Noah
行号:4,起始位置:21,姓名:Emma
行号:5,起始位置:27,姓名:Oliver
行号:6,起始位置:35,姓名:Charlotte
行号:7,起始位置:46,姓名:Elijah
行号:8,起始位置:55,姓名:Amelia
行号:9,起始位置:63,姓名:Bob
行号:10,起始位置:68,姓名:Roy

如果你的"位置"指的是其他含义(比如姓名在数组中的索引),可以基于这段代码进一步调整逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:01:01