将std::string转换为const char*,得到错误
Converting std::string to const char*, getting errors
#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_str
是std::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);
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- strncpy之后的char数组的错误行为
- C++错误:初始值设定项过多,无法'char[26]'
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 使用 char* 存储数据和产生的错误
- 为什么将指针重新分配给 1D 数组的 char 时显示错误,但 2D 数组工作正常?
- JavaCPP 错误:无法将参数"1"的"char*"转换为"Abc*
- C++错误:无法将参数 2 从 'char' 隐蔽到 char[]'
- 当我尝试通过构造函数分配 char 数组时出现错误
- 将错误作为从字符串常量到"char*"的已弃用转换 [-Wwrite-strings]
- 获取"rw_ssid"中成员"长度"的错误请求,该成员属于非类类型"char*"
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- C++ [错误] 声明'char '隐藏参数。什么意思?
- 错误LNK2019未解析的外部符号"public: __thiscall SLinkList<char>::SLinkList<char>(void)"
- 错误:请求成员 .. 是非类类型"char"
- 使用 rapidxml::xml_node::first_attribute 时出现分段错误<char>
- C++错误 - 'char' 和'int'之前的预期主表达式
- 为什么 std::cin 没有给出错误"char"
- 错误:“char(CharStack::)()const throw(CharStack:Underflow)”类型的参
- 错误:char*类型的参数与LPCWSTR类型的参数不兼容