フレックスから送られたバイソンのトークン値を印刷しようとしていますが、何らかの理由で印刷された値がごみになることがあります。フレックスからバイソンへの値渡し
のlexコード:
\".*\" {
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];
}
I入力15文字未満の長さを持つ文字列、それは細かい出力が、長さは、それを超えた場合にはゴミがプリントされた場合。
私はC++コードを分離して実行してもうまく動作しますが、なぜそれが起こっているのか分からないので、誰かが間違いを見つけることができます。
がどのように文字列データ型の最大サイズよりも長い文字列を作成するのですか? – rici
std :: string * s1 = new std :: string(yytext)を使用して、s1を作成したときに最初に文字列の長さを拡張するための規定があります。 s1にyytextの長さを与えていたはずです。もし私がs1の値を表示していれば、それは正しく印刷されています。そうでなければ、最大デフォルトサイズは11です。これは非常に短いです。 –
11は文字列の最大サイズではありません。文字列の最大サイズは 'std :: basic_string :: max_size()'です。これは11よりかなり大きいです:http://ideone.com/7z5oDh – rici