以及其他指针的C / Lex char指针打印值

问题描述 投票:0回答:1

我正在编写一个lex程序。我已经初始化了3个char指针。然后,如果它们满足条件,则将它们定义为令牌。但是,当我随后打印它们时,第一个打印所有3的值,第二个打印第二个值,最后一个打印其值。为什么会这样呢?这是我的代码:

%{
    #include<stdio.h>
    #include<string.h>

    int for_cond = 0;
    char *cond1, *cond2, *cond3;
    char * for_body = "";
    //char * loop = "";
    %}
    VAR [a-zA-Z_]+[a-zA-Z0-9_]*
    %%
    for[ ]*\( {for_cond++;}
    int[ ]+{VAR}[ ]*\=[ ]*[0-9]+ {if(for_cond==1){cond1 = yytext;}else if(for_cond==4){for_body = strcat(for_body,yytext);}}
    ; {if(for_cond==1||for_cond==2){for_cond++;} else if(for_cond==4){for_body = strcat(for_body,yytext);}}
    {VAR}[ ]*(\<|\>|\<\=|\>\=|\=\=)[ ]*[0-9]+ {if(for_cond==2){cond2 = yytext;}else if(for_cond==4){for_body = strcat(for_body,yytext);}}
    {VAR}[ ]*((\+\+|\-\-)|((\+\=|\-\=|\*\=|\/\=)[ ]*({VAR}|[0-9]+))) {if(for_cond==3){cond3 = yytext;}else if(for_cond==4){for_body = strcat(for_body,yytext);}}
    %%
    int yywrap(void){}
    int main(){

        yylex();
        printf("cond1 = %s\ncond2 = %s\ncond3 = %s\n", cond1, cond2, cond3);

        return 0;
    }

示例输入:

for(int i=0;i<=2;i++)

预期输出:

cond1 = int i=0

cond2 = i<=2

cond3 = i++

我得到的是:

cond1 = int i=0;i<=2;i++)

cond2 = i<=2;i++)

cond3 = i++)

为什么会这样?我该如何解决?

c string pointers lex char-pointer
1个回答
1
投票

yytext指向词法分析器内部的临时数据结构,其生存期限于词法分析器操作。 (更确切地说,其生存期始于词法分析器操作,并在词法扫描之前结束。)

换句话说,您无法将yytext的值保存为指针。如果要保留字符串以供以后使用,则必须复制yytext指向的字符串的内容。如果您有strdup,则可以使用它来创建字符串的副本(但是当您不再需要它时,请不要忘记将其复制到free()。)如果您没有strdup,或者无论出于何种原因,您都可以自己动态分配空间:

char* theToken = malloc(yyleng + 1); strcpy(theToken, yytext);

还值得一提的是,考虑到for_body指向长度为0(char * for_body = "";)的不变字符串,试图向其中添加文本是未定义的行为:

strcat(for_body,yytext);

在许多平台上,该调用将发生段错误,因为for_body的初始化使它指向只读内存。但是,如果内存是可写的,则它不是for_body指向的数组的一部分,这意味着它是某些其他对象的一部分,该对象的值将被调用strcat破坏。

© www.soinside.com 2019 - 2024. All rights reserved.