如何将常量字符 * 转换为 std::string
How to convert a const char * to std::string
c 样式字符串转换为 std::string 的正确/最佳/最简单的方法是什么?
转换应接受max_length,并在第一个 \0 字符处终止字符串(如果这发生在max_length章程之前(。
这个关于string::string
的页面提供了两个潜在的构造函数,它们可以做你想要的:
string ( const char * s, size_t n );
string ( const string& str, size_t pos, size_t n = npos );
例:
#include<cstdlib>
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
int main(){
char* p= (char*)calloc(30, sizeof(char));
strcpy(p, "Hello world");
string s(p, 15);
cout << s.size() << ":[" << s << "]" << endl;
string t(p, 0, 15);
cout << t.size() << ":[" << t << "]" << endl;
free(p);
return 0;
}
输出:
15:[Hello world]
11:[Hello world]
第一种形式认为p
是一个简单的数组,因此将创建(在我们的例子中(一个长度为 15 的字符串,但是它打印为一个 11 个字符的以 null 结尾的字符串,带有 cout << ...
.可能不是你要找的。
第二种形式将隐式将char*
转换为字符串,然后保留其长度和指定n
之间的最大值。我认为就您必须编写的内容而言,这是最简单的解决方案。
std::string str(c_str, strnlen(c_str, max_length));
应克里斯蒂安·劳的要求:
strnlen
在 POSIX.1-2008 中指定,可在 GNU 的 glibc 和Microsoft运行时库中使用。 在其他一些系统中尚未找到它;你可能会回到格努利布的替代品。
std::string the_string(c_string);
if(the_string.size() > max_length)
the_string.resize(max_length);
这实际上比看起来更棘手,因为你不能打电话strlen
除非字符串实际上以 NUL 结尾。 事实上,没有一些额外的约束,这个问题实际上需要发明一个新的函数,一个永远不会超出某个strlen
的版本长度。 然而:
如果包含 c 样式字符串的缓冲区保证至少 max_length
字符(尽管可能在结束前有一个' '
(,然后你可以使用 std::string
的地址长度构造函数,并且之后修剪:
std::string result( c_string, max_length );
result.erase( std::find( result.begin(), result.end(), ' ' ), result.end() );
如果你知道c_string
是一个以 NUL 结尾的字符串(但也许长于max_length
,可以使用strlen
:
std::string result( c_string, std::min( strlen( c_string ), max_length ) );
有一个构造函数接受两个指针参数,所以代码很简单
std::string cppstr(cstr, cstr + min(max_length, strlen(cstr)));
如果长度小于std::string cppstr(cstr)
,这也将像max_length
一样有效。
你想要的是这个构造函数: std::string ( const string& str, size_t pos, size_t n = npos )
,将 pos 传递为 0。您的 const char* c 样式字符串将被隐式转换为第一个参数的 const 字符串。
const char *c_style = "012abd";
std::string cpp_style = std::string(c_style, 0, 10);
更新:从cpp_style
初始化中删除了"新">
- 将无符号char*转换为std::istream*C++
- 将 int 数组转换为 std::vector<int*>
- 如何将这个std::字符串转换为std::基本字符串
- 哪些类型可以转换为std::any
- 如何在对<char>C++程序进行逆向工程的同时将 std::basic_string 转换为 Rust 可读值?
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 将函数参数"const char*"转换为"std::string_view"是
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 字符转换功能 std::isupper() & std::islower() C++17
- 将函数包装器转换为 std::function
- 如何将 std::ifstream 转换为 std::basic_istream<CharT, Traits>&?
- 显式 std::exception_ptr 转换为 bool 不存在.VS2010 错误?
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- std::转换move构造函数的模板专业化的变体
- STD ::转换如何用特定值初始化函子
- 对C++字符串使用 std 转换
- 等价于元组的std::转换
- std::转换为任意容器
- std::转换顺序保证
- std::转换产生奇怪的输出