C语言读取文件时如何忽略标点符号等指定输入?
解决C语言读取文件时忽略标点符号的问题
我来帮你搞定这个问题!你的代码里有几个关键的小问题需要修正,同时调整fscanf的扫描集用法,就能实现忽略标点的需求了。先拆解下问题:
你的代码里的几个核心问题
- 未初始化的指针:
char *lineofText;只是声明了一个指针,但没有给它分配任何内存空间,直接用fscanf往里面写数据会导致程序崩溃或者出现乱码(未定义行为)。 feof的错误用法:while (!feof(myFileHandle))是常见的误区——feof只有在读取失败后才会被置位,这会导致最后一次循环重复读取无效内容。正确的做法是把读取操作本身作为循环条件。- 扫描集格式符错误:
%[,]s的写法完全不对,%[]是fscanf的扫描集语法,需要明确指定要保留的字符或者要排除的字符。
修正后的解决方案
下面给你两种实用的方案,根据你的需求选就行:
方案1:只读取英文字母(自动忽略所有非字母标点)
如果你的单词都是纯英文字母,这个方案最直接——跳过所有非字母字符,只读取连续的字母作为单词:
#include <stdio.h> #include <string.h> int main() { FILE *myFileHandle = fopen("test1.txt", "r"); // 先检查文件是否成功打开 if (myFileHandle == NULL) { perror("Failed to open file"); return 1; } char lineofText[100]; // 用固定大小数组分配内存,避免指针问题 // %*[^a-zA-Z]:跳过所有非字母字符(*表示不存储这些字符) // %[a-zA-Z]:读取连续的字母作为单词 while (fscanf(myFileHandle, "%*[^a-zA-Z]%[a-zA-Z]", lineofText) != EOF) { puts(lineofText); } fclose(myFileHandle); return 0; }
方案2:排除指定的标点符号(比如逗号、句号等)
如果需要自定义忽略的标点(比如只忽略逗号、句号,保留其他特殊字符),可以用这种方式:
#include <stdio.h> #include <string.h> int main() { FILE *myFileHandle = fopen("test1.txt", "r"); if (myFileHandle == NULL) { perror("Failed to open file"); return 1; } char lineofText[100]; // %[^,. \n]:读取所有不是逗号、句号、空格、换行的字符(即一个单词) while (fscanf(myFileHandle, "%[^,. \n]", lineofText) != EOF) { puts(lineofText); // %*[,. \n]:跳过后面的分隔符,准备读取下一个单词 fscanf(myFileHandle, "%*[,. \n]"); } fclose(myFileHandle); return 0; }
额外提示
- 如果你的单词包含特殊字符(比如连字符
-、撇号'),可以把这些字符加入扫描集,比如%[a-zA-Z'-]。 - 如果担心固定数组大小不够,可以用
malloc动态分配内存,记得最后用free释放。
内容的提问来源于stack exchange,提问作者user7531258
相关产品推荐
相关产品推荐

