双指针作为参数

Double pointer as parameter

我有以下原型:

int Split(const char* str, const char* delim,unsigned int& numtokens,char **tokensRes)

最后一个参数用于return这个函数的响应。在函数中我们有以下内容:

.
.
char **tokens =(char**) calloc(tokens_alloc, sizeof(char*));
.
.
.
//at the end of the code
tokensRes = tokens;
.

When returns tokens variable direct when the value of the function return is char** 我收到正确的答案,但是使用上面的方法 return 的功能是空的。我怎样才能使这个功能正常工作?

编辑 1: 我的意图是接收一个 char 数组,例如:

array[0] = "ABC"
array[1] = "ABC"
array[2] = "ABC"
array[3] = "ABC"

假设你想return一个字符串数组(char**),那么你需要传递一个指向这样一个你可以赋值的数组的指针。也就是说,您需要传递一个 char*** 并将其分配为 *tokensRes = tokens.

只需放弃普通的 C 类型并使用 C++ 类型:

std::vector<std::string> Split(std:;string const& str, std::string const& delim, unsigned int& numtokens);

如果您必须坚持使用 C 接口,则需要使用三重指针进行额外的间接寻址(我假设您想要 return 一个标记字符串数组)。

int Split(const char* str, const char* delim,unsigned int& numtokens,char ***tokensRes)

char** tokens;
Split("String;String", ";", 2, &tokens);

我真的不喜欢输出参数,而且我总是想知道为什么有人不在 C++ 中使用 std::string

标记化已在许多库中实现,例如在 boost::split or boost::tokenizer。无需重新发明轮子:

// simple_example_1.cpp
#include<iostream>
#include<boost/tokenizer.hpp>
#include<string>

int main(){
   using namespace std;
   using namespace boost;
   string s = "This is,  a test";
   tokenizer<> tok(s);
   for(tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){
       cout << *beg << "\n";
   }
}

The output from simple_example_1 is:

This
is
a
test

更改原型自:

int Split(const char* str, const char* delim,unsigned int& numtokens,char **tokensRes)

收件人:

int Split(const char* str, const char* delim,unsigned int& numtokens,char ** &tokensRes)

并且代码 tokensRes = tokens; 将起作用。要理解为什么要多了解 C++ 和 references.

如果您打算从 C 风格的编码转移到 C++ 编码,那么关于使用字符串的其他答案也是有效的。编码的便利性会提高很多,而且不用担心内存管理和指针(并不经常),这些由 类 自动完成。只要您遵循良好做法(例如通过引用而不是值传递对象),也不用担心性能下降。