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; }
核心问题梳理
行处理未重置索引
外层循环每次读取新行到buffer后,y保留着上一行的末尾位置,直接进入内部循环时buffer[y]已是'\0',导致后续所有行完全不被处理。非括号字符引发死循环
遇到既不是'('也不是')'的字符时,没有任何处理逻辑,y不会递增,buffer[y]始终指向该字符,内部循环无限执行。词素初始化缺失
strncat要求目标字符串以'\0'结尾,而aLex[n].lexeme未初始化时,strncat会读取随机内存,行为未定义。未返回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
相关产品推荐
相关产品推荐

