当你必须将它作为char *传递时,std :: string比char *更好吗?

时间:2010-11-03 01:44:13

标签: c++ cstring stdstring

recent question中,我了解到有些情况下您只需传递char*而不是std::string。我非常喜欢string,对于我只需要传递不可变字符串的情况,它可以正常使用.c_str()。我看待它的方式,利用字符串类来简化操作是个好主意。但是,对于需要输入的函数,我最终会做这样的事情:

std::string str;
char* cstr = new char[500]; // I figure dynamic allocation is a good idea just
getstr(cstr);               // in case I want the user to input the limit or
str = cstr;                 // something. Not sure if it matters.
delete[] cstr;
printw(str.c_str());

显然,情况并非如此,呃,直截了当。现在,我对C ++很新,所以我无法真正看到树林。在这样的情况下,每个输入都必须转换为C字符串并返回以利用string的有用方法,这是一个更好的想法,让人熟悉并习惯C语言式字符串操作?这种持续的来回转换是不是太愚蠢了?

2 个答案:

答案 0 :(得分:3)

在您提供的示例中,您通常可以使用std::string函数在std::getline中读取一行:http://www.cplusplus.com/reference/string/getline/

当然,这并不能完成curses库所做的一切。如果您需要非const char*以便某些C函数可以读入它,则可以使用vector<char>。您可以从vector<char>创建string,反之亦然:

std::string       a("hello, world");
std::vector<char> b(a.begin(), a.end());

// if we want a string consisting of every byte in the vector
std::string       c(b.begin(), b.end());

// if we want a string only up to a NUL terminator in the vector
b.push_back(0);
std::string       d(&b[0]);

所以你的例子变成了:

std::vector<char> cstr(500);
getnstr(&cstr[0], 500);
printw(&cstr[0]);

答案 1 :(得分:1)

大多数std :: string :: c_str()实现(如果不是全部)只是返回一个指向内部缓冲区的指针。没有任何开销。

请注意,c_str()会返回 const char* ,而不是char *。并且在函数调用之后指针将变为无效。因此,如果函数执行任何操作,例如写回传递的字符串或复制指针,则无法使用它。