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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:02:18