在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语言式字符串操作?这种持续的来回转换是不是太愚蠢了?
答案 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 *。并且在函数调用之后指针将变为无效。因此,如果函数执行任何操作,例如写回传递的字符串或复制指针,则无法使用它。