从 getline 中取出垃圾
Getting garbage out from getline
我从 getline 中得到垃圾,但我不确定我做错了什么。
这是代码:
std::string str = "/command?device=c53b1f8&zoom=24&tilt=80";
std::istringstream ss(str);
std::string buf;
while (std::getline(ss, buf, '&'))
{
printf("%s\n", buf);
}
输出:
á╚╢ºA
á╚╢ºA
á╚╢ºA
你的错误在这里:
printf("%s\n", buf);
std::printf()
是一个 C 语言函数,它适用于 C 风格的空终止字符串。它根本不理解std::string
。以你现在的方式使用它是 未定义的行为。你奇怪的结果是由于打印 std::string
的内部结构直到内存中遇到的第一个 0x00
字节。
正确的解决方法是使用std::cout
代替:
std::cout << buf << '\n';
但是,如果您想坚持使用 printf()
,那么您可以让 std::string
使用其 c_str()
方法输出 C 风格的字符串,如下所示:
std::printf("%s\n", buf.c_str());
我从 getline 中得到垃圾,但我不确定我做错了什么。 这是代码:
std::string str = "/command?device=c53b1f8&zoom=24&tilt=80";
std::istringstream ss(str);
std::string buf;
while (std::getline(ss, buf, '&'))
{
printf("%s\n", buf);
}
输出:
á╚╢ºA
á╚╢ºA
á╚╢ºA
你的错误在这里:
printf("%s\n", buf);
std::printf()
是一个 C 语言函数,它适用于 C 风格的空终止字符串。它根本不理解std::string
。以你现在的方式使用它是 未定义的行为。你奇怪的结果是由于打印 std::string
的内部结构直到内存中遇到的第一个 0x00
字节。
正确的解决方法是使用std::cout
代替:
std::cout << buf << '\n';
但是,如果您想坚持使用 printf()
,那么您可以让 std::string
使用其 c_str()
方法输出 C 风格的字符串,如下所示:
std::printf("%s\n", buf.c_str());