C语言实现输出文本文件中含指定字母的单词 用户编写的代码报core dumped错误
文件单词搜索程序核心转储问题排查
原代码运行触发核心转储、功能无法正常实现的原因共6处,逐点说明:
- fopen传参错误:
fopen(path, 'r')中打开模式参数需要是双引号包裹的字符串常量"r",单引号包裹的'r'是整数类型值,会被fopen当成无效的文件地址指针读取,直接触发野指针访问。 - 栈溢出触发崩溃:代码中定义
char letter[1]存储搜索字符,但scanf("%s", letter)读取字符串时会自动在末尾追加'\0'字符串结束符,仅1字节的数组无法容纳结束符,会溢出覆盖栈上存储的函数返回地址,这是core dump的最主要诱因。 - 字符串比较逻辑错误:C语言中直接用
==对比两个字符串时,对比的是两块内存的起始地址,不是字符串的实际内容,原代码写的if (str == letter)永远不会匹配到有效内容,完全达不到搜索效果。 - 功能逻辑偏差:原代码读取整行内容后直接做对比,没有对行内容做单词拆分,就算修正字符串比较逻辑,也只能匹配整行和搜索内容完全一致的情况,无法实现“打印文件中所有包含指定字母的单词”的需求。
- printf参数使用不规范:原代码写
printf(letter),将用户输入的搜索内容直接作为printf的格式字符串,如果用户输入内容包含%这类格式转义符,会直接触发未定义行为导致崩溃。 - 函数定义不符合规范:按照C语言标准,
main函数的返回值类型应当为int,原代码写的void main()属于非标准写法;findWord函数声明返回值为int,但函数内部没有任何返回语句,属于逻辑不完整。
修正后可正常运行的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #define BUFFER_SIZE 1000 // 定义单词的分隔符集合,覆盖常见的空白、标点分隔场景 #define WORD_DELIMITERS " \t\n\r,.;:!?-()[]{}'\"" void findWord(FILE *file, char target); int main() { FILE *file; char path[100]; char target_char; printf("Enter file path: "); scanf("%s", path); printf("Enter letter to search in file: "); // 格式串前加空格,跳过输入缓冲区残留的换行符,避免直接读入换行 scanf(" %c", &target_char); file = fopen(path, "r"); if (file == NULL) { perror("Unable to open file"); exit(EXIT_FAILURE); } findWord(file, target_char); fclose(file); return 0; } void findWord(FILE *file, char target) { char line_buf[BUFFER_SIZE]; char *word; // 逐行读取文件内容 while (fgets(line_buf, BUFFER_SIZE, file) != NULL) { // 按分隔符拆分行内的独立单词 word = strtok(line_buf, WORD_DELIMITERS); while (word != NULL) { // 检查当前单词是否包含目标字符 if (strchr(word, target) != NULL) { printf("%s\n", word); } // 继续拆分当前行的后续单词 word = strtok(NULL, WORD_DELIMITERS); } } }
内容的提问来源于stack exchange,提问作者TheHawk3r
相关产品推荐
相关产品推荐

