自定义指令集架构汇编器字符串拆分异常问题求助及解决方案
自定义ISA汇编器Token拆分异常问题求助
我已经为这个问题折腾好几个小时了,却始终找不到代码里的问题所在。目前我正在为一款自定义指令集架构(Instruction Set Architecture, ISA)编写一个简易汇编器,它的功能是读取输入文件并逐行解析——解析时我计划把每行内容按空格拆分,将生成的Token存入数组供后续处理。
下面是我实现Token拆分功能的部分代码:
char** tokens = (char**) malloc(sizeof(char*)); char* linecpy = strcpy(linecpy, line); char* tok_ptr = strtok(linecpy, " "); int tokenid = 0; while(tok_ptr) { tokens = (char**) realloc(tokens, (tokenid+1) * sizeof(char*)); tokens[tokenid] = tok_ptr; tokenid++; tok_ptr = strtok(NULL, " "); }
为了测试功能是否正常,我让程序依次打印数组里的每个Token,结果发现本该完整的Token出现了随机拆分的情况:
汇编文件中的行:
jsr fibloop ; jump to the main program loop
预期输出(按空格拆分):jsr、fibloop、;、jump、to、the、main、program、loop
实际输出:jsr、fibloo、p、;、jump、to、the、main、pr、ogram、l、oop
我花了大量时间尝试解决却毫无进展,希望能得到大家的反馈和潜在解决方法。
问题修正与补充
感谢社区成员Clifford和4386427的快速回复,他们指出了问题的根源:linecpy未分配内存,且我错误地认为strcpy会直接返回一个新字符串。
以下是修正后的可用代码,同时我还按照Clifford的建议添加了注释过滤功能——当解析器遇到注释字符;时就停止Token化,因为后续内容都是注释,对解析器没有意义:
char** tokens = (char**) malloc(sizeof(char*)); // 为linecpy分配足够内存:原字符串长度+1(存储终止符) char* linecpy = malloc(strlen(line) + 1); strcpy(linecpy, line); char* tok_ptr = strtok(linecpy, " "); int tokenid = 0; while(tok_ptr) { /* 如果Token以注释字符开头,则停止Token化,后续内容均为注释 */ if(tok_ptr[0] == ';') break; tokens = (char**) realloc(tokens, (tokenid+1) * sizeof(char*)); tokens[tokenid] = tok_ptr; tokenid++; tok_ptr = strtok(NULL, " "); } // 解析完成后记得释放tokens分配的内存 free(tokens);
希望这段修正后的代码能帮助遇到相同问题的人,社区的帮助真的很大,再次感谢!
内容的提问来源于stack exchange,提问作者CodeKraken
相关产品推荐
相关产品推荐

