使一个适用于旧C字符串(char *,int)的函数可以在std :: string&上工作。

时间:2011-11-30 06:52:23

标签: c++ coding-style

假设我有一个非常复杂的缓冲区加扰函数,可以使用以下原型:

void do_something(char * thebuffer, int thelength);

假设我需要让函数在std :: string上运行。但是std :: string.c_str()返回const char *,这是不可变的。

除了创建一个新的char *缓冲区并将其传递给do_something之外,是否可以将do_something用于std :: string?

我的情况实际上是另一种方式(char *,int到std :: string& taking函数)。

或者是解决这个问题的唯一方法,就是去制作一个新的功能副本,它会做同样的事情吗? (这并不是真正的好风格)

3 个答案:

答案 0 :(得分:5)

只要不超过

,你就可以安全地施放它

do_something((char *)mystring.c_str(), mystring.size());

do_something(&mystring[0], mystring.size());

或更多C++ ish

do_something(const_cast<char *>(mystring.c_str()), mystring.size());

旁注:

std::vector<char>是缓冲区比string更好的类型。您只需将&myvec[0]用作char*

即可

答案 1 :(得分:1)

你可以使它成为模板函数,然后传递一个字符串:: iterator而不是char *。或者简单地让它接受string :: iterator。如果您只使用顺序访问,则可能不需要重写函数中的任何其他内容。

void do_something(string::iterator thebuffer, int thelength);

答案 2 :(得分:0)

没有制作新功能,但是重载当前的功能,只是传递内容。

void do_something(std::vector<char>& buf){
  do_something(&buf[0], buf.size());
}

在调用您的函数时,您可以免于出现乱码和麻烦的麻烦。