2014-11-08 26 views
-1

這是我的代碼着副本的strcpy

的strcpy犯規的yytext中複製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一個= 「asdasd」 運行;

我期待它打印 a asdasd

回答

2

此:

int x=sizeof(yytext); 

沒有做什麼,你認爲它。 yytext類型爲char*;也就是說,它是一個指向角色的指針。這意味着sizeof yytext是4或8,具體取決於您是在32位還是64位平臺上編譯。 (或者其他一些指針長度,如果你有一個非常不尋常的架構)。

它不是從yytext開始的字符串的長度。這將是標準庫函數strlen(yytext)

但是,您也不需要使用它,因爲flex已將令牌的長度有用地分配給全局變量yyleng

當你爲拷貝分配空間時,不要忘記在C 字符串總是以NUL結尾的。這意味着字符串的分配必須(至少)大於字符串的長度,這意味着您需要yyleng + 1字節。