Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使一个在旧C字符串(char*,int)上工作的函数在std::string&;_C++_Coding Style - Fatal编程技术网

C++ 使一个在旧C字符串(char*,int)上工作的函数在std::string&;

C++ 使一个在旧C字符串(char*,int)上工作的函数在std::string&;,c++,coding-style,C++,Coding Style,假设我有一个非常复杂的缓冲区置乱函数,它对以下原型执行某些操作: void do_something(char * thebuffer, int thelength); 假设我需要让函数处理std::string。但是std::string.c_str()返回常量char*,它是不可变的 除了创建一个新的char*缓冲区并将其传递给do_something之外,还可以对std::string使用do_something吗 我的情况实际上是另一种情况(将char*,int转换成std::stri

假设我有一个非常复杂的缓冲区置乱函数,它对以下原型执行某些操作:

void do_something(char * thebuffer, int thelength);
假设我需要让函数处理std::string。但是std::string.c_str()返回常量char*,它是不可变的

除了创建一个新的char*缓冲区并将其传递给do_something之外,还可以对std::string使用do_something吗

我的情况实际上是另一种情况(将char*,int转换成std::string&taking函数)


或者是唯一的解决方法,就是制作一个新的函数副本,它做同样的事情?(这不是很好的风格)

你可以安全地投下它,只要它不超过这个尺寸

dou_something((char*)mystring.c_str(),mystring.size())

dou_something(&mystring[0],mystring.size())

或更多
C++
ish

do_something(const_cast(mystring.c_str()),mystring.size())

旁注:


std::vector
是比
字符串更好的缓冲区类型。而不仅仅是将
&myvec[0]
用作
char*

只要不超过大小,就可以安全地将其强制转换

dou_something((char*)mystring.c_str(),mystring.size())

dou_something(&mystring[0],mystring.size())

或更多
C++
ish

do_something(const_cast(mystring.c_str()),mystring.size())

旁注:


std::vector
是比
字符串更好的缓冲区类型。而不是将
&myvec[0]
用作
char*

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

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

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

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

不是创建一个新函数,而是重载当前函数,只是传递一些内容

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

在调用函数时,避免了施放和其他操作的麻烦。

不创建新函数,而是重载当前函数,只需传递内容即可

void do_something(string::iterator thebuffer, int thelength);
void do_something(std::vector<char>& buf){
  do_something(&buf[0], buf.size());
}
void do_某事(std::vector&buf){
做某事(&buf[0],buf.size());
}

在调用函数时避免了强制转换和其他操作的麻烦。

小心点,就像在C++03中一样,std::string类不需要使用连续内存来表示()。希望它是在C++0x()@Drahakar中实现的,但是没有其他(合理的)方法来实现它。它必须能够返回c_str();至少使用C++的CAST(COSTRACCAST),也不能缩小大小。如果我们假设连续的内存,那么<代码>和STR(0)< /代码>也应该是一个字符串。请小心,如在C++ 03中,STD::String类不需要使用连续的内存来表示()。希望它是在C++0x()@Drahakar中实现的,但是没有其他(合理的)方法来实现它。它必须能够返回c_str();至少使用C++的CaskCask(CistaScCupe),你也不能缩小大小。如果我们假设连续的内存,那么<代码>和STR(0)< /代码>也可以是一个字符串。你的字符串有多大?为什么不复制呢?旁注:
std::vector
对于缓冲区来说比字符串更好。而不仅仅是将
&myvec[0]
用作
char*
(这不是很好的风格)–一个重载可以用另一个重载实现,你不应该复制代码本身。你的字符串有多大?为什么不复制呢?旁注:
std::vector
对于缓冲区来说比字符串更好。而不仅仅是将
&myvec[0]
用作
char*
(这并不是很好的风格)–一个重载可以在另一个重载中实现,您不应该复制代码本身。
void do_something(string::iterator thebuffer, int thelength);