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

C语言Tokenizer函数运行中断问题排查(原代码无此异常)

C语言Tokenizer函数运行异常的问题排查与修复

我的C语言程序无法完整运行,之前使用相同代码时并未出现该问题。以下是项目中的tokenizer函数代码(已补充注释说明上下文),推测问题出在循环逻辑中:

#include <stdio.h>
#include "Tokenizer.h"
#include <string.h>

// 项目中其他函数均正常,问题仅出在此处
_Bool tokenizer(struct lexics *aLex, int *numLex, FILE *inf){
  int y = 0;
  int n = 0;
  char buffer[256];
  // 读取文本文件,生成词素并分词后存入结构体(结构体已在别处定义)
  while(fgets(buffer, MY_CHAR_MAX, inf) != NULL){
    // 确保未到文件末尾
    while(buffer[y]!= '\0'){
      if(buffer[y]=='('){
        aLex[n].token=LEFT_PARENTHESIS;
        strncat(aLex[n].lexeme, &buffer[y], 1);
        y++;
        n++;
      }
      else if(buffer[y]==')'){
        aLex[n].token=RIGHT_PARENTHESIS;
        strncat(aLex[n].lexeme, &buffer[y], 1);
        y++;
        n++;
      }
    }
  }
  return TRUE;
}

核心问题梳理

  1. 行处理未重置索引
    外层循环每次读取新行到buffer后,y保留着上一行的末尾位置,直接进入内部循环时buffer[y]已是'\0',导致后续所有行完全不被处理。

  2. 非括号字符引发死循环
    遇到既不是'('也不是')'的字符时,没有任何处理逻辑,y不会递增,buffer[y]始终指向该字符,内部循环无限执行。

  3. 词素初始化缺失
    strncat要求目标字符串以'\0'结尾,而aLex[n].lexeme未初始化时,strncat会读取随机内存,行为未定义。

  4. 未返回token数量
    函数结束后未更新*numLex,调用者无法获知生成的token总数。

修复后的代码

#include <stdio.h>
#include "Tokenizer.h"
#include <string.h>

_Bool tokenizer(struct lexics *aLex, int *numLex, FILE *inf){
  int y = 0;
  int n = 0;
  char buffer[256];

  while(fgets(buffer, MY_CHAR_MAX, inf) != NULL){
    y = 0; // 处理新行前重置索引到起始位置
    while(buffer[y]!= '\0'){
      if(buffer[y]=='('){
        aLex[n].token = LEFT_PARENTHESIS;
        // 直接赋值单个字符并手动添加结束符,替代不安全的strncat
        aLex[n].lexeme[0] = buffer[y];
        aLex[n].lexeme[1] = '\0';
        y++;
        n++;
      }
      else if(buffer[y]==')'){
        aLex[n].token = RIGHT_PARENTHESIS;
        aLex[n].lexeme[0] = buffer[y];
        aLex[n].lexeme[1] = '\0';
        y++;
        n++;
      }
      else {
        // 跳过非括号字符,避免死循环
        y++;
      }
    }
  }
  *numLex = n; // 向调用者返回生成的token数量
  return TRUE;
}

内容的提问来源于stack exchange,提问作者Yeabsera Yimer Wolle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:25:20