我想消除字符串开头和结尾的双引号。
我使用 Lex 规则从输入文件中获取字符串文字,如下所示:
\".*\" {yyno++; yylval.string = strdup(yytext); return STRINGLITERAL;}
但是当我在 Yacc 程序的某个地方使用字符串时,我只想使用字符串部分。
你能帮我解决这个问题吗?
您只需要参加相关部分,例如:
// 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
。
\".*\" {
yylval.string = (char*)calloc(strlen(yytext)-1, sizeof(char));
strncpy(yylval.string, &yytext[1], strlen(yytext)-2);
return STRINGLITERAL;
}
Jan 解释得很好,我只是在澄清 lex 并为下一个可怜的灵魂修正一些错别字。