【发布时间】:2017-04-16 17:03:23
【问题描述】:
我正在尝试打印从 flex 发送的 bison 中的令牌值,但由于某种原因,打印的值在某些情况下是垃圾。
法码:
\".*\" {
std::string* s1 = new std::string(yytext);
std::string s2 = *s1;
std::string s3 = s2.substr(1,s2.size() - 2);
yylval.s = &s3;
return VARIABLE;
}
野牛代码:
%union{
std::string *s;
};
%type <s> expr
expr : VARIABLE { caps($1); }
void caps(std::string *str){
std::string str1 = *str;
for(std::string::size_type i=0;i<str1.length();i++)
std::cout << str1[i];
}
如果我输入一个长度小于 15 个字符的字符串,它会输出正常,但如果长度超过它会打印垃圾。
如果我隔离 c++ 代码并运行它工作正常,我不明白为什么会发生,所以有人可以找到其中的错误。
【问题讨论】:
-
如何创建一个长度超过字符串数据类型最大大小的字符串?
-
第一次使用 std::string* s1 = new std::string(yytext);会给 s1 一个 yytext 的长度。如果我打印 s1 的值,则打印正确,否则最大默认大小为 11,非常短
-
11 不是字符串的最大大小。字符串的最大大小为
std::basic_string::max_size(),比11大很多:ideone.com/7z5oDh
标签: c++ compiler-construction bison flex-lexer bisonc++