将字符串传递给字符串流时,特殊字符消失。 我尝试了这个可以直接测试的代码:
#include <iostream>
#include <sstream>
using namespace std;
int main(int argc, char* argv[]) {
string txt("hehehaha\n\t hehe\n\n<New>\n\ttest:\t130\n\ttest_end:\n<New_end>\n");
cout << txt << endl; // No problem with new lines and tabs
stringstream stream;
stream << txt;
string s;
while(stream >> s) {
cout << s; // Here special characters like '\n' and '\t' don't exist anymore.
}
cout << "\n\n";
return 0;
}
我能做些什么来克服这个问题?
编辑:我试过了:
stream << txt.c_str();
它有效。但我不知道为什么......
答案 0 :(得分:1)
cout << stream.str() << endl;
一些细节。您正在呼叫operator<<(string)
重载运算符&lt;&lt;表现如ostream :: operator&lt;&lt; 对于c-strings
对引用的行为进行了解释here:
(2)字符序列将C字符串s插入os。终止 null字符未插入os。 c字符串的长度是 事先确定(好像在调用strlen)。
Strlen documentation表示结果只受
的影响终止空字符
实际上,您的示例中的strlen(tmp)
输出55。
因此,流将“分配”输入字符串中第55个字符的所有内容。
cout << stream.str() << endl;
会告诉你确实发生了这种情况。
括号:您可以通过设置/取消设置标志来修改stream << txt
行的行为,如
stream.unsetf ( std::ios::skipws );
你应该试试。
答案 1 :(得分:0)
声明
while(stream >> s)
问题在于,每次调用都会给你一个令牌,使用空格进行拆分,因而忽略它们。