lex - 如何从字符串文字中删除双引号

时间:2013-01-06 18:13:04

标签: c lex

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

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

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

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

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

2 个答案:

答案 0 :(得分: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,那么从{{1}开始复制8 - 2个字符最后设置'f'终止字符。

实际上,calloc内存已设置为0,因此您不需要放置NULL终止字符,而是放置NULL

答案 1 :(得分:1)

\".*\" {
    yylval.string = (char*)calloc(strlen(yytext)-1, sizeof(char));
    strncpy(yylval.string, &yytext[1], strlen(yytext)-2);
    return STRINGLITERAL;
}
Jan解释得很清楚,我只是澄清了这个词,并为下一个可怜的灵魂修正了一些错别字。