我想删除位于字符串开头和结尾的双引号。
我使用Lex规则从输入文件中获取字符串文字,如下所示:
\".*\" {yyno++; yylval.string = strdup(yytext); return STRINGLITERAL;}
但是当我在Yacc程序中的某处使用字符串时,我只想使用字符串部分。
你能帮我解决这个问题吗?
答案 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解释得很清楚,我只是澄清了这个词,并为下一个可怜的灵魂修正了一些错别字。