Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C/Lex char指针打印其他指针的值_C_String_Pointers_Lex_Char Pointer - Fatal编程技术网

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

C/Lex char指针打印其他指针的值,c,string,pointers,lex,char-pointer,C,String,Pointers,Lex,Char Pointer,我正在写一个lex程序。我已经初始化了3个字符指针。然后我将它们定义为令牌,如果它们满足条件。但是当我以后打印它们时,第一个打印所有3的值,第二个打印最后两个值,最后一个打印本身。为什么会这样?这是我的密码: %{ #include<stdio.h> #include<string.h> int for_cond = 0; char *cond1, *cond2, *cond3; char * for_body = "";

我正在写一个lex程序。我已经初始化了3个字符指针。然后我将它们定义为令牌,如果它们满足条件。但是当我以后打印它们时,第一个打印所有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++)
为什么会这样?如何修复此问题?

yytext指向lexer内部的临时数据结构,其生存期仅限于lexer操作。更准确地说,它的生命周期从lexer操作开始,在词法扫描之前结束

换句话说,您不能将yytext的值保存为指针。如果要保留该字符串以供以后使用,则必须复制yytext指向的字符串的内容。如果您有strdup,您可以使用它来创建字符串的副本,但不要忘记在不再需要它时释放副本。如果您没有strdup,或者出于任何原因不想使用它,您可以自己动态分配空间:

char* theToken = malloc(yyleng + 1); strcpy(theToken, yytext);
还值得一提的是,如果for_body指向长度为0 char*for_body=;的不可变字符串;,试图向其中添加文本是未定义的行为:

strcat(for_body,yytext);

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

你能用正常缩进将代码分成多行吗,所以我们可以更容易地阅读它?所以基本上我是在做文本的深度复制,而我应该做一个浅层复制,对吗?另外,如果我用来更新_body的方法不正确,那么正确的方法是什么?我想动态地向它添加文本,类似于如何使用C++来使用C++。你应该复制它。C没有字符串,也没有办法增加C数组。您所能做的就是分配一个更大的数组并进行复制。没有什么阻止你使用C++和Flex;生成的代码可以编译为C++,并且运行良好。您可能会发现这是一个更舒适的解决方案。如果你想使用C,你需要阅读动态分配。那么cond1=yytext到底做什么呢?将yytext指向的char数组的内存位置复制到cond1?@ShantanuShinde:指针是原语值,所以是;之后,cond1和yytext指向同一个位置。这是Flex内部缓冲区中的某个地方。不复制任何字符。这与std::str cond1=yytext;,有很大不同;,这将复制字符。