C程序问题:无法正确打印目标字符串在文本文件中的行号
问题分析与修复方案
首先看你的代码,行号统计错误主要是因为行号逻辑、文件读取方式以及变量初始化/重置这几个地方出了问题,我帮你拆解一下问题点,再给出修复后的代码:
主要问题点
- 未正确识别行边界:你用
fscanf("%s", string)读取单词,它会跳过所有空白字符(包括换行),根本没法区分不同的行;而且变量chr完全没被赋值,if (chr == '\n')这个判断完全无效。 - 行号未重置:每次查询新字符串时,
line_number没有重置为1,导致第二次及以后的查询会累加之前的行号,结果自然不对。 - 输入逻辑顺序颠倒:循环一开始就打开文件,此时
student初始是全0值,会直接进入查询逻辑,然后才提示输入,流程完全反了。 - 字符串匹配逻辑混乱:
strstr(string, student) == 0的判断写反了,还和无效的换行判断混在一起,完全达不到匹配目标字符串的效果。
修复后的代码
#include <string.h> #include <stdlib.h> #include <stdio.h> int main() { char student[100] = {0}; char line[100]; // 存储读取的整行内容 FILE *in_file; // 先提示输入,再判断是否退出 printf("please enter a word (enter '0' to exit)\n"); scanf("%s", student); while (strcmp(student, "0") != 0) { int line_number = 1; int found_flag = 0; // 标记是否找到目标字符串 in_file = fopen("student.txt", "r"); if (in_file == NULL) { printf("Error file missing\n"); exit(1); } // 用fgets读取整行,准确识别行边界 while (fgets(line, sizeof(line), in_file) != NULL) { // 检查当前行是否包含目标字符串 if (strstr(line, student) != NULL) { printf("Found at line number: %d\n", line_number); found_flag = 1; } line_number++; // 每读取一行,行号自增 } if (!found_flag) { printf("The word '%s' was not found in the file.\n", student); } fclose(in_file); // 准备下一次输入 printf("\nplease enter a word (enter '0' to exit)\n"); scanf("%s", student); } return 0; }
修复说明
- 改用
fgets读取整行:fgets会完整读取一行内容(包括换行符),这样就能准确统计行号,每读取一行就把line_number加1。 - 每次查询重置行号:把
line_number放在循环内部定义,这样每次查询新字符串时,行号都会从1开始计数。 - 修正输入逻辑:先让用户输入字符串,再判断是否退出,避免初始空值进入查询的问题;同时用
strcmp判断是否输入"0",比直接判断student[0]更严谨(比如输入"00"不会误判为退出)。 - 添加未找到提示:如果目标字符串没出现在文件里,会给出明确提示,交互更友好。
- 精简无效变量:删掉了没用的
chr和num变量,让代码更简洁。
你可以试试这个版本,应该能正确输出目标字符串所在的行号了。
内容的提问来源于stack exchange,提问作者cat020
相关产品推荐
相关产品推荐

