无法用strcpy复制yytext

时间:2014-11-08 16:06:37

标签: flex-lexer lex

这是我的代码

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

1 个答案:

答案 0 :(得分:2)

此:

int x=sizeof(yytext);

没有做你认为的事情。 yytext的类型为char*;也就是说,它是一个指向角色的指针。这意味着sizeof yytext为4或8,具体取决于您是否在32位或64位平台上进行编译。 (或者如果你有一个非常不寻常的架构,可以使用其他指针长度。)

不是从yytext开始的字符串的长度。这将是标准库函数strlen(yytext)

但是,您也不需要使用它,因为flex已将令牌的长度有用地分配给全局变量yyleng

当您为副本分配空间时,请不要忘记在C 字符串中始终以NUL终止。这意味着字符串的分配必须(至少)大于字符串的长度,这意味着您需要yyleng + 1个字节。