如何将const char*转换为std :: string

All*_*lan 32 c++

将c样式字符串转换为std :: string的正确/最佳/最简单方法是什么?

转换应接受max_length,并在第一个\ 0 char处终止字符串,如果这发生在max_length charter之前.

Vla*_*lad 30

这个页面string::string提供了两个可能做你想做的构建器:

string ( const char * s, size_t n );
string ( const string& str, size_t pos, size_t n = npos );
Run Code Online (Sandbox Code Playgroud)

例:

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

15:[Hello world]
11:[Hello world]
Run Code Online (Sandbox Code Playgroud)

第一种形式认为p是一个简单的数组,因此将创建(在我们的例子中)一个长度为15的字符串,然而它打印为一个11个字符的以空字符结尾的字符串cout << ....可能不是你想要的.

第二种形式将隐式转换char*为字符串,然后在其长度和n您指定的长度之间保持最大值.我认为这是最简单的解决方案,就你必须写的内容而言.


eph*_*ent 13

std::string str(c_str, strnlen(c_str, max_length));
Run Code Online (Sandbox Code Playgroud)

Christian Rau的要求下:

strnlenPOSIX.1-2008中指定,可在GNU的glibcMicrosoft运行时库中使用.在其他一些系统中尚未发现; 你可能会回到Gnulib的替补.


Dan*_*ani 5

std::string the_string(c_string);
if(the_string.size() > max_length)
    the_string.resize(max_length);
Run Code Online (Sandbox Code Playgroud)

  • C样式字符串应始终以NULL结尾. (7认同)
  • 如果c_string没有正确地以NULL结尾怎么办? (2认同)

Jam*_*nze 5

这实际上比看起来更棘手,因为strlen 除非字符串实际上以 nul 结尾,否则您无法调用。事实上,如果没有一些额外的限制,这个问题实际上需要发明一个新函数,它的版本strlen永远不会超过一定的长度。然而:

如果保证包含 c 样式字符串的缓冲区至少是 max_length字符(尽管可能'\0'在结尾之前带有 a ),那么您可以使用 , 的地址长度构造函数std::string,然后进行修剪:

std::string result( c_string, max_length );
result.erase( std::find( result.begin(), result.end(), '\0' ), result.end() );
Run Code Online (Sandbox Code Playgroud)

如果您知道这c_string是一个以 nul 结尾的字符串(但可能长于max_length,您可以使用strlen

std::string result( c_string, std::min( strlen( c_string ), max_length ) );
Run Code Online (Sandbox Code Playgroud)