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

Lex程序统计文本时字符数错误、单词数为0仅行数正确问题求助

问题原因

你的代码存在4个核心错误,直接导致统计结果异常:

  • 第一条规则.*\n优先级过高,会匹配整行(含换行符),匹配成功后直接跳过后续所有规则,所以单词规则完全不会触发,这是单词数为0的核心原因。同时该规则仅给charNum加1,只统计了换行符的长度,整行其他字符都没计入,导致字符数统计错误。
  • 第二条单词匹配规则的模式开头多写了一个空格,该空格属于匹配条件的一部分,仅当前置有空格的单词才会命中,进一步降低了规则触发概率。另外你用量词*,会匹配0个字符的空串,即使规则触发也会多统计无效单词,应该换为+要求至少匹配1个有效字符。
  • yywrap函数没有返回值,按照Lex规范,yywrap处理完所有输入后需要返回1标识结束,否则会出现运行异常。
  • 参数校验逻辑不完善,仅判断了参数过多的情况,未处理用户未传入文件路径、文件打开失败的场景,容易触发段错误。

修正后完整代码

%{
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int charNum = 0, wordNum = 0, lineNum = 0;
%}
%%
\n                 { charNum++; lineNum++; }
[a-zA-Z0-9]+       { wordNum++; charNum += strlen(yytext); }
.                  { charNum++; }
%%
int yywrap(void)
{
    return 1;
}
int main(int argc, char*argv[]){
    if(argc != 2){
        printf("Usage: %s <text_file_path>\n", argv[0]);
        exit(1);
    }
    yyin = fopen(argv[1], "r");
    if (yyin == NULL) {
        printf("File open failed\n");
        exit(1);
    }
    yylex();
    fclose(yyin);
    printf("Number of character: %d\n", charNum);
    printf("Number of words: %d\n", wordNum);
    printf("Number of Lines: %d\n", lineNum);
    return 0;
}

修正逻辑说明

  • 调整规则顺序,先单独匹配换行符统计行数,不会吞掉整行内容,后续单词规则可以正常命中
  • 去掉单词规则前的冗余空格,量词替换为+,保证只有有效单词才会被统计
  • 补全yywrap返回值,完善参数校验和文件打开校验逻辑,避免程序崩溃
  • 剩余的单字符规则用来统计空格、标点等非单词非换行字符的数量,保证字符数统计准确

内容的提问来源于stack exchange,提问作者chad davis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:36:07