这是我的代码
strcpy不会复制yytext
有什么建议吗?
这些是我的全局
char** v; /* array of variables and their values */
int i;
一些名称定义
WORD [a-zA-Z]
DIGIT [0-9]
这些是州
<VAL>"\"".+"\"" {int x=sizeof(yytext);
v[i]=(char*)realloc(v, x*sizeof(char));
strcpy(v[i],yytext);
i++;
BEGIN(INITIAL);}
<VAL>. { i--;printf("error");}
<SAVE_VAL>{WORD}[{WORD}{DIGIT}_]* {
if (NULL==v){
v=(char**)realloc(v, 100*sizeof(char*));
i=0;
}
int x=sizeof(yytext);
v[i]=(char*)realloc(v, x+2);
strcpy(v[i],yytext);
i++;
BEGIN(VAL);
}
val" " {BEGIN(SAVE_VAL);}
这是yywrap
int yywrap(void){
return 1;
}
这是主要的
int main(void) {
yyin=fopen("input.txt","r");
yylex();
fclose(yyin);
这是打印字符串的循环
for (int j=0;j<100;j++){
if (NULL==v[j])
break;
printf("%s",v[j],i);
}
}
}
我要开始运行它 val a =&#34; asdasd&#34 ;;
我希望它能打印出来
a
asdasd
答案 0 :(得分:2)
此:
int x=sizeof(yytext);
没有做你认为的事情。 yytext
的类型为char*
;也就是说,它是一个指向角色的指针。这意味着sizeof yytext
为4或8,具体取决于您是否在32位或64位平台上进行编译。 (或者如果你有一个非常不寻常的架构,可以使用其他指针长度。)
不是从yytext
开始的字符串的长度。这将是标准库函数strlen(yytext)
。
但是,您也不需要使用它,因为flex
已将令牌的长度有用地分配给全局变量yyleng
。
当您为副本分配空间时,请不要忘记在C 字符串中始终以NUL终止。这意味着字符串的分配必须(至少)大于字符串的长度,这意味着您需要yyleng + 1
个字节。