将std :: string转换为const char *,获取错误

时间:2013-12-20 20:53:14

标签: c++ string types

#include <iostream>
#include <sstream>

template <typename T>
const char* numberToString(T number) {
    std::ostringstream ss;
    ss << number;
    return ss.c_str();
}

int main() {
    printf(numberToString(123));
    return 0;
}

我的错误:

1>d:\programming\euler\problem 4\problem 4\problem 4\source.cpp(8): error C2039: 'c_str' : is not a member of 'std::basic_ostringstream<char,std::char_traits<char>,std::allocator<char>>'
1>          d:\programming\euler\problem 4\problem 4\problem 4\source.cpp(26) : see reference to function template instantiation 'const char *numberToString<int>(T)' being compiled
1>          with
1>          [
1>              T=int
1>          ]

为什么这不起作用?

4 个答案:

答案 0 :(得分:7)

c_strstd::string的成员,而不是ostringstream。如果您想从流中获取string,请使用str()。但请注意,从const char*返回string是错误的 - string将超出范围,然后才能使用const char*。因此,让函数返回string(或让它获取要写入的缓冲区):

template <typename T>
std::string numberToString(T number) {
    std::ostringstream ss;
    ss << number;
    return ss.str();
}

答案 1 :(得分:4)

c_str()不存在

std::ostringstream。你的意思是:

template <typename T>
const char* numberToString(T number) 
{
    std::ostringstream ss;
    ss << number;
    return ss.str().c_str();
}

进行更改后,您将遇到另一个问题:您将返回指向刚刚销毁的缓冲区的指针。要解决此问题,您应该返回std::string

template <typename T>
std::string numberToString(T number) 
{
    std::ostringstream ss;
    ss << number;
    return ss.str();
}

您已经可以使用std::to_string,因此编写自己的函数毫无意义。

答案 2 :(得分:2)

那是因为c_str()std::string的成员函数,它返回const char*

要获取strinstream的基础字符串,必须使用str()

错误几乎是自我解释的:

  

错误C2039:'c_str':不是'std :: basic_ostringstream

的成员

但是请注意,您将返回一个指向某些内容的指针(由str()返回的临时字符串的基础数据),该指针在返回语句之后(即在调用代码中)不存在并且操纵该指针非常肯定会以未定义的行为结束。

当你在C ++中时,你宁愿直接返回std::string,并用

输出它
std::cout << numberToString(123);

哪个会更安全。

答案 3 :(得分:2)

你想这样做:

template <typename T>
std::string numberToString(T number) {
    std::ostringstream ss;
    ss << number;
    return ss.str();
}

int main() {
    std::cout << numberToString(123);
    return 0;
}

要获取std::string中的基础std::ostringstream,然后获取std::string中生成的c样式字符串。正如其他人指出的那样,c_str返回的指针超出范围,因此您必须将其复制到缓冲区或另一个std::string。如果您坚持使用printf,请在函数调用中使用c_str

printf("%s", numberToString(123).c_str());

有关详细信息,请参阅Is it a good idea to return " const char * " from a function?

  

取决于somestlstring是什么以及在那里做了什么。

     

如果是局部变量,则返回指向内存的指针   在GetSomeString完成时正在发布,所以它是一个悬空   指针和错误。

     

这一切归结为somestlstring和操作的生命周期   你表演它。保证.c_str()返回的指针   仅在字符串中的下一个变异操作有效。因此,如果   某些东西会从调用.c_str()和s之前改变somestlstring   构建你将处于不确定的行为之地。

但是,您只需使用std::to_string

std::string s = std::to_string(123);