将std::string转换为const char*,得到错误

Converting std::string to const char*, getting errors

本文关键字:错误 char const std string 转换      更新时间:2023-10-16
#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:programmingeulerproblem 4problem 4problem 4source.cpp(8): error C2039: 'c_str' : is not a member of 'std::basic_ostringstream<char,std::char_traits<char>,std::allocator<char>>'
1>          d:programmingeulerproblem 4problem 4problem 4source.cpp(26) : see reference to function template instantiation 'const char *numberToString<int>(T)' being compiled
1>          with
1>          [
1>              T=int
1>          ]

为什么不起作用?

c_strstd::string的成员,而不是ostringstream。如果要从流中获得string,请使用str()。但是,请注意,从string返回const char*是错误的——在使用const char*之前,string将超出范围。因此,让您的函数返回一个string(或者让它获得一个要写入的缓冲区):

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

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了,所以编写自己的函数是没有意义的。

这是因为c_str()是返回const char*std::string的成员函数。

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

这个错误几乎是不言自明的:

错误C2039:"c_str":不是"std::basic_ostringstream "的成员

请注意,您返回的指针(str()返回的临时字符串的基础数据)在return语句之后(即在调用代码中)将不存在,并且操纵该指针肯定会导致未定义的行为。

在C++中,您可以直接返回std::string,并使用输出

std::cout << numberToString(123);

这样会更安全。

您想要做的事情:

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::ostringstream中获取底层std::string,然后在std::string中获取生成的c样式字符串。正如其他人所指出的,c_str返回的指针超出了范围,因此必须将其复制到缓冲区或另一个std::string。如果您坚持使用printf,那么在函数调用上使用c_str

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

有关更多信息,请参阅返回"是个好主意吗;const char*";从函数?

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

如果它是一个局部变量,则返回一个指向内存的指针在GetSomeString完成时被释放,因此它是一个悬空的指针和错误。

这一切都归结为一些字符串的生命周期和操作对其执行。.c_str()返回的指针保证为仅在字符串中的下一个变异操作之前有效。所以如果有东西将调用中的somestlstring更改为.cstr()并且在s之前如果被建造,你将处于未定义的行为领域。

但是,您可以简单地使用std::to_string

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