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

时间:2011-11-14 18:45:10

标签: c++

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

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

6 个答案:

答案 0 :(得分:28)

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的字符串,然后将其打印为带有{{1}的11个字符的以空字符结尾的字符串}。可能不是你想要的。

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

答案 1 :(得分:13)

std::string str(c_str, strnlen(c_str, max_length));

Christian Rau的请求:

strnlenPOSIX.1-2008中指定,可在GNU的glibcMicrosoft run-time library中找到。在其他一些系统中尚未发现;你可以回到Gnulib的替代品。

答案 2 :(得分:5)

std::string the_string(c_string);
if(the_string.size() > max_length)
    the_string.resize(max_length);

答案 3 :(得分:4)

这实际上比它看起来更棘手,因为你无法调用strlen 除非字符串实际上是nul终止的。事实上,没有一些 额外的限制,这个问题实际上需要发明一个新的 函数,strlen的一个版本,它永远不会超越某个版本 长度。但是:

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

std::string result( c_string, max_length );
result.erase( std::find( result.begin(), result.end(), '\0' ), result.end() );

如果你知道c_string是一个空终止的字符串(但也许 超过max_length,您可以使用strlen

std::string result( c_string, std::min( strlen( c_string ), max_length ) );

答案 4 :(得分:0)

有一个构造函数接受两个指针参数,因此代码只是

 std::string cppstr(cstr, cstr + min(max_length, strlen(cstr)));

如果长度小于std::string cppstr(cstr),这也会与max_length一样高效。

答案 5 :(得分:-1)

你想要的是这个构造函数: 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 = new std::string(c_style, 0, 10);