双指针作为参数
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++ 编码,那么关于使用字符串的其他答案也是有效的。编码的便利性会提高很多,而且不用担心内存管理和指针(并不经常),这些由 类 自动完成。只要您遵循良好做法(例如通过引用而不是值传递对象),也不用担心性能下降。
我有以下原型:
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++ 编码,那么关于使用字符串的其他答案也是有效的。编码的便利性会提高很多,而且不用担心内存管理和指针(并不经常),这些由 类 自动完成。只要您遵循良好做法(例如通过引用而不是值传递对象),也不用担心性能下降。