从 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());