使用std::stringstream转换为字符串在空格处失败

conversion to string with std::stringstream fails on white spaces

本文关键字:空格 字符串 失败 std stringstream 转换 使用      更新时间:2023-10-16

我试图将任何字符串或字符或数字转换为std::stringstreamstd::string。这就是我正在做的:

template<typename T>
std::string toString(T a){
    std::string s;
    std::stringstream ss;
    ss <<a;
    ss >>s;
    return s;
    }
int main(int argc, char* argv[]) {
    char s[100]="I am a string with spaces";
    std::cout<<toString(s);
    return 0;
} 

但是在第一个空格处失败。

输出:

I
预期输出

:

I am a string with spaces

我该怎么做呢?

注意:s也可以包含换行符

operator<<插入s到stringstream没有问题。这和你做std::cout << s没有什么不同。你做错的是从流中提取到s。这将只读取一个空白字符(包括空格和换行符)。要获取流的内容,执行:

return ss.str();

然而,这只是一种令人费解的方式:

std::string str = s;

只需将整个程序减少10行:

#include <iostream>
int main(int argc, char* argv[]) {
    char s[100]="I am a string with spaces";
    std::cout<<std::string(s);
    return 0;
} 

您可以使用std::ostringstream::str()成员函数直接访问流的字符串化内容。

template <typename T>
std::string toString(const T& a)
{
    std::ostringstream ss;
    //   ↑
    ss << a;
    return ss.str();
    //     ~~~~~~~^
}

如果你真的需要使用stringstream,那么有一个可能的解决方案:(我不假装有一个好的代码)

template<typename T>
std::string toString(T a) {
    std::stringstream ss;
    ss << a;
    const char* s = ss.str().c_str();
    ss.read((char *)s, ss.str().length());
    return s;
}