如何解决C++ 指向字符串数组中字符指针的指针
我必须测试这个功能
std::vector<std::string> convert_arguments(int argc,char **argv) {
[some code]
return command_arguments;
};
接受一个指向命令参数数组的指针并返回一个包含这些参数的 Vector。该功能运行良好。但是我自己构建这样的指针时遇到了麻烦。该数组是一个字符串数组,即字符数组的数组。据我所知,指针应该指向指向字符串第一个字母的指针的第一个指针(这听起来很奇怪)。我需要的是一个示例指针 **argv,我可以将它传递给函数以查看它是否有效。我知道互联网上有很多类似的问题,但我真的找不到适合我的答案。如果您能帮助我,我将不胜感激,因为我已经寻找了几个小时的答案。
解决方法
命令行参数使用两种约定来传递参数的数量:
- 它被明确地传入
argc
-
argv
数组包含一个空指针作为其最后一个(有用的)元素
因为您可以为 const char *
构造一个字符串,所以代码可以很简单:
std::vector<std::string> convert_arguments(int argc,char **argv) {
std::vector<std::string> command_arguments;
for (int i=0; i<argc; i++) {
command_arguments.push_back(std::string(argv[i]));
}
return command_arguments;
}
或(第二个约定):
std::vector<std::string> convert_arguments(int argc,char **argv) {
std::vector<std::string> command_arguments;
for (const char **ix=argv; ix!=nullptr; ix++) {
command_arguments.push_back(std::string(*ix++));
}
return command_arguments;
}
如果你想为测试构建这样一个数组,你可以很容易地从文字字符串中完成:
const char *const_argv[] = { "foo","fee","bar","baz",nullptr}; // add the last null
int my_argc = sizeof(my_argv)/sizeof(*my_argv) - 1; // but do no count it
char ** my_argv = const_cast<char **>(const_argv); // cast it
注意:这段代码正确地将 const_argv
声明为一个指向 const 字符的指针数组,因为字符串文字是 const,并且使用 const_cast
能够传递它上面的功能。这是无害的,因为该函数从不尝试更改其参数,但规则是应尽可能避免 const_cast
。
如果你真的需要一个非常量字符串的数组,你必须先构建字符串,然后再构建数组:
char a1[] = "foo";
char a2[] = "fee";
char a3[] = "bar";
char a4[] = "baz";
char *argv[] = {a1,a2,a3,a4,nullptr};
,
char** argv
实际上只是一个二维数组。您可以通过创建这样的数组
char** argv = new char*[argc];
。然后,您可以使用 for(int i=0;i < argc; ++i)
循环遍历 argv 数组,并为每个条目分配您想要的任何字符串。
这里 argc 存储传递的参数数量, argv 存储所有参数。 你可以做类似的事情,
std::vector<std::string> vec;
for (int counter=1;counter<argc;counter++) //0th argument is the program name
{
vec.push_back(argv[counter]); //push each string into vector
}
return vec;
,
您可以使用 C 风格的字符数组指针来实现这一点:
#include <vector>
#include <string>
#include <iostream>
using namespace std;
// borrowed from prehistoricpenguin
std::vector<std::string> convert_arguments(int argc,const char **argv) {
return std::vector<std::string>(argv + 1,argv + argc);
}
bool test1(void) {
int argc = 5;
const char *argv[] = {"program_name","some string","another","command","ok",NULL };
std::vector<std::string> myexpectedvector = {"some string","ok" };
std::vector<std::string> s = convert_arguments(argc,argv);
return (s == myexpectedvector);
}
int main () {
std::cout << test1() << std::endl;
}
,
单行版本:
std::vector<std::string> convert_arguments(int argc,argv + argc);
}
或者用上面的 c++11 更简单
std::vector<std::string> convert_arguments(int argc,const char **argv) {
return {argv + 1,argv + argc};
}
说明:
我们用两个迭代器范围调用std::vector
的构造函数(指针可以当作迭代器),因为argv是一个指针数组,左边的范围是argv+1
,右边的范围是{{ 1}}。
对于 argv + argc
构造函数,传递了 std::string
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。