【发布时间】:2020-10-14 21:36:15
【问题描述】:
我正在为必须使用 Flex 的学校做作业。我正在尝试做一些简单的字符串操作,但我遇到了一些我不理解的奇怪结果。下面的代码应该将输入的第二个字母替换为相应的数字。
我的代码:
uid [a-z][a-z][a-z]+
%%
{uid} {
char ID[strlen(yytext)];
strncat(ID, yytext, 1);
char comp = yytext[1];
if (comp=='a'||comp=='j'||comp=='s'){
strcat(ID,"1");
}else if(comp=='b'||comp=='k'||comp=='t'){
strcat(ID,"2");
}else if(comp=='c'||comp=='l'||comp=='u'){
strcat(ID,"3");
}else if(comp=='d'||comp=='m'||comp=='v'){
strcat(ID,"4");
}else if(comp=='e'||comp=='n'||comp=='w'){
strcat(ID,"5");
}else if(comp=='f'||comp=='o'||comp=='x'){
strcat(ID,"6");
}else if(comp=='g'||comp=='p'||comp=='y'){
strcat(ID,"7");
}else if(comp=='h'||comp=='q'||comp=='z'){
strcat(ID,"8");
}else if(comp=='i'||comp=='r'){
strcat(ID,"9");
}
strncat(ID,yytext+2,strlen(yytext)-2);
printf("%s\n",ID);
printf("ID strlen: %d\n",strlen(ID));
return 1;
上面的代码运行后得到的结果是:
所以我不太确定为什么会得到上述结果,这个结果也不能完全重现,我得到的随机字母和字符总是不同的。我已经查阅了有关如何操作字符串的多个指南,但我无法弄清楚我在一生中做错了什么。第一个输入的结果是正确的,但是我尝试输入的第二个输入会导致无法读取的字符。
【问题讨论】:
-
char ID[strlen(yytext)]; strncat(ID, yytext, 1);。这是未定义的行为,因为strncat需要一个字符串作为第一个参数,而您拥有的是一个未初始化的缓冲区。 -
你可能想要
char ID[strlen(yytext) + 1]; strncpy(ID, yytext, strlen(yytext) + 1);
标签: c string flex-lexer