1

我在 main 之上定义了一些结构:

struct arguments
{
   int c;
   char *v[];
};

现在我想主要这样做:

int main(int argc, char *argv[])
{
    arguments arg;

    arg.c = argc;
    arg.v = argv; /* error: incompatible types in assignment of 'char** to char* [0]' */
}

所以,我不完全理解我在做什么,但本能地我重新制作了结构,char *v[];但是char **v[];,这意味着当我通过引用我的结构arg时,如果我想取消引用并获取 的值arg.v[0],这将是程序名称,我现在必须这样做*arg.v[0],这不再适用于*arg.v[1].

我有一个功能,例如:

void argument_reader(arguments &arg)
{
   cout << "Number of arguments: " << arg.c << endl << endl;
   cout << "Array\t\tValue\n";
   cout_bar(40);
   for (int i = 0; i < arg.c; i++)
   {
      cout << "argv[" << i << "]\t\t" << *arg.v[i] << endl;
   }
   return;
}

但是当我调用*arg.v[i]程序结束时没有打印第二个参数或任何其他参数的值。

所以我的问题是,有没有什么方法可以使用结构在函数之间传递,这样我就可以arg.v[some_index < arg.c]在另一个函数内部调用,方法是按照我的意图使线路arg.v = argv在 main 工作中(存储argvin的地址arg.v

结构所做的一切就是使它不必传递argc和传递argv给具有如下声明的函数:void func(int &argc, char *argv[]);我可以将具有变量名的新结构类型传递arg给声明为类似的函数void func(arguments &arg),这基本上就是我想要的结构. 所以如果我不能这样做,那么我可以回到第一种方法。

4

3 回答 3

4

你需要写:

struct arguments
{
    int    c;
    char **v;
};

现在你的main()意志奏效了。(这种混乱是我总是使用的原因int main(int argc, char **argv),但这是个人的怪癖。)

如果您在 C99 或更高版本中工作,那么您使用结构创建的就是所谓的“灵活数组成员”(FAM),它是 C99 对 C89 的补充(因此也超过了 C++98)。我没有注意到您正在使用 C++ 工作!C 中有关于 FAM 的特殊规则,您不能像使用灵活数组成员那样进行赋值。

但是,该修复程序在 C++ 中与在 C 中一样有效;您使用 FAM 并不一定是正确的。您是否使用支持 FAM 作为扩展的 C++ 编译器?

在您的输出行中,您有:

cout << "argv[" << i << "]\t\t" << *arg.v[i] << endl;

这将打印参数的第一个字符;删除*,你会得到第一个参数作为字符串:

cout << "argv[" << i << "]\t\t" << arg.v[i] << endl;
于 2013-02-28T05:22:29.430 回答
3

将您的结构更改为:

struct arguments
{
   int c;
   char **v;
};

C 风格的数组和指针非常相似,您可以像您的版本或原始argv参数一样使用上述结构。

实际上,通常 main 函数是这样声明的,而不是使用 []:

int main(int argc, char **argv)

请注意,使用此答案代码v指向指向 char 的原始argv指针数组,不会复制指针。如果您确实想要一个副本,则需要动态分配 char 指针数组并进行复制。

于 2013-02-28T05:28:57.317 回答
1

两件事情:

struct arguments
{
   int c;
   char *v[]; /*unknown length, hence structure is incomplete*/
};

你需要一个双指针,它保存着argv

    struct arguments {
       int c;
       char **v;
    };
于 2013-02-28T05:26:11.257 回答