0

我想消除字符串开头和结尾的双引号。

我使用 Lex 规则从输入文件中获取字符串文字,如下所示:

\".*\"   {yyno++; yylval.string = strdup(yytext); return STRINGLITERAL;}

但是当我在 Yacc 程序的某个地方使用字符串时,我只想使用字符串部分。

你能帮我解决这个问题吗?

4

2 回答 2

2

您只需要参加相关部分,例如:

 // you allocate a string which is the length of the token - 2 " + 1 for '\0'
 yylval.string = calloc(strlen(yytext)-1, sizeof(char));
 // you copy the string
 strncpy(yylval.string, &yytext[1], strlen(yytext-2));
 // you set the NULL terminating at the end
 yylval.string[yytext-1] = '\0';

因此,如果yytext == "\"foobar\""首先分配长度8 - 2 + 1 = 7字节的字符串(这是正确的,因为它将是foobar\0,然后从 开始复制 8-2 个字符'f',最后设置NULL终止字符。

实际上,使用 calloc 内存已设置为 0,因此您不需要放置NULL终止字符,但您会这样做malloc

于 2013-01-06T18:25:12.110 回答
1
\".*\" {
    yylval.string = (char*)calloc(strlen(yytext)-1, sizeof(char));
    strncpy(yylval.string, &yytext[1], strlen(yytext)-2);
    return STRINGLITERAL;
}

Jan 解释得很好,我只是在澄清 lex 并为下一个可怜的灵魂修正一些错别字。

于 2013-11-22T20:38:55.570 回答