C++std::字符串流到常量字符*的转换
C++ std::stringstream to const char* conversion
我试图将stringstream
转换为const char*
,但总是得到一个空字符串。
我的代码:
#include<string>
#include<sstream>
#include<stdio.h>
const char* test(std::string city, std::string street, int houseNumber, int postCode) {
std::stringstream ss;
ss << city << " " << street << " " << houseNumber << " " << postCode;
const std::string tmp = std::string{ss.str()};
const char* str = tmp.c_str();
return str;
}
int main(){
printf(test("demo", "Demo", 1, 1234));
}
预期输出:demo Demo 1 1234
我尝试了"如何将std::string转换为const char*或char*?"中提到的所有增强功能?,但我没有成功。
问题是const char*
指向的字符串数据在return str;
之后被释放。只要关联的std::string
实例在作用域内,const char*
指针将保持有效。这是假设您在这里显示的代码位于一个函数中。在这种情况下,字符串tmp
将在return str;
之后超出作用域,并且它的析构函数将被调用,导致任何指向其字符数据的指针都变成悬空指针。
返回一个std::string
,并对返回的字符串调用c_str()
。如上所述,只要关联的std::string
实例在作用域内,就可以使用const char*
指针。
您遇到的问题是,当此函数离开作用域时(即,当return str;
执行时(,str
指向的内存将被清除。您需要返回一个对象,该对象将保持对数据的所有权。
//std::string_view is >=c++17, use std::string const& for older compilers
std::string get_formatted_address(
std::string_view city,
std::string_view street,
std::string_view houseNumber,
std::string_view postCode
) {
std::stringstream ss;
ss << city << " " << street << " " << houseNumber << " " << postCode;
return ss.str();
}
int main() {
auto city = "New York", street = "Rockefeller Lane", houseNumber = "1234", postcode = "56789";
auto formatted_address = get_formatted_address(city, street, houseNumber, postcode);
//Here, formatted_address holds ownership over the memory, so calling c_str is safe
printf("Address: %sn", formatted_address.c_str());
}
通过使用static thread_local
存储临时对象,可以将悬挂引用转换为非悬挂引用。
请注意,一次只能有一个活动的"非悬挂"引用:
#include <string>
#include <sstream>
#include <iostream>
const char* to_cstr(std::string && s)
{
static thread_local std::string sloc;
sloc = std::move(s);
return sloc.c_str();
}
const char* make_address(std::string const& city,
std::string const& street,
std::string const& houseNumber,
std::string const& postCode)
{
std::stringstream ss;
ss << city << " " << street << " " << houseNumber << " " << postCode;
return to_cstr(std::move(ss).str());
}
int main()
{
const char* p = make_address("London","Bob Street","42","W1ABC");
std::cout << p << std::endl;
}
预期输出:
London Bob Street 42 W1ABC
http://coliru.stacked-crooked.com/a/228e6c0cb8359222
相关文章:
- HEX值到wchar_t字符(UTF-8)的转换
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 转换特殊字符(UTF-8)
- 将转换字符键入 int 以用作向量C++的索引
- 将字符随机转换为大写的函数
- 尝试将字符串/字符转换为整数会产生意外结果
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 转换字符时Arduino DUE 和 Arduino UNO 之间的区别
- 如何在C++中正确重载运算符转换字符*?
- 如何转换数据结构以在 c++ 中转换字符*
- 不兼容的转换字符
- 将转换字符数组[16]键入为int 128位
- 在c++中转换字符编码
- 使用递归转换字符
- 如何在Objective-C/C/C++中转换字符和字节的位置
- C++到Pep/8汇编语言的转换——字符数组
- 转换字符>十六进制