双指针作为参数

Double pointer as parameter

本文关键字:参数 指针      更新时间:2023-10-16

我有以下原型:

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

最后一个参数用于返回此函数的响应。在函数中,我们有以下内容:

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

当返回函数的返回时,直接变量的令牌值char**我收到正确的答案,但是使用上面的方法,函数的返回为空。如何使此功能正常工作?

编辑 1:我的目的是接收一个字符数组数组,例如:

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

将原型从:

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++和参考的更多信息。

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

假设你想返回一个字符串数组 ( char** ),那么你需要传递一个指针,指向你可以分配的数组。也就是说,您需要传递一个char***并像*tokensRes = tokens一样分配它。

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

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

如果你必须坚持使用 C 接口,你需要一个带有三重指针的额外间接寻址(我假设你想返回一个令牌字符串数组)。

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 或 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";
   }
}

simple_example_1的输出为:

This
is
a
test