【问题标题】:store argv[1] to an char variable将 argv[1] 存储到 char 变量中
【发布时间】:2021-09-17 16:56:05
【问题描述】:

我将一个字符传递给我的程序,我想将此字符存储到变量中。例如,我像这样./a.out s file 运行我的程序。现在我想将 argv[1](它的 s)保存到一个变量中(假设我这样定义它char ch;。我看到了这种方法:

ch = argv[1][0];

它有效。但我无法理解。数组 argv 不是一维数组吗?如果我删除 [0],我会收到警告 warning: assignment makes integer from pointer without a cast

【问题讨论】:

  • "数组 argv 不是一维数组?" - 不:char *argv[]——它是一个指向指针的指针。 (您可以将其视为指向指向char 的指针数组的第一个元素的指针。
  • 在 C 中,数组和指针之间的区别可能看起来有点模糊。指针总是可以解释为指向数组第一个元素的指针并用 [] 索引,而 argv[1] 给出指向 char 的指针,因此可以添加另一个 [] 将其用作 char 数组(这就是它的真正含义)情况下)。
  • 好的,我明白了。我读了这个crasseux.com/books/ctutorial/argc-and-argv.html,上面写着argv is a one-dimensional array of strings。这就是为什么我认为它是一维的。
  • C 有两种字符串数组:一维 char 指针数组(每个指向 char 数组,甚至可以是同一个,指针也可以为 NULL)和二维char 数组(每行是具有最大行大小长度的字符串)。不过,指针数组更常见。

标签: c argv


【解决方案1】:

如果您查看main() 的声明,您会发现它是

int main(int argc, const char **argv);

int main(int argc, const char *argv[]);

所以argvconst char * 的数组(即字符指针或“C 字符串”)。如果你取消引用argv[1],你会得到:

"s"

或:

{ 's' , '\0' }

如果你取消引用argv[1][0],你会得到:

's'

附带说明,无需从argv[1] 复制该字符,您只需这样做:

const char *myarg = NULL;

int main(int argc, const char **argv) {
    if (argc != 2) {
        fprintf(stderr, "usage: myprog myarg\n");
        return 1;
    } else if (strlen(argv[1]) != 1) {
        fprintf(stderr, "Invalid argument '%s'\n", argv[1]);
        return 2;
    }

    myarg = argv[1];

    // Use argument as myarg[0] from now on

}

【讨论】:

  • 如何将 char * argv[] 转换为 char 变量和 char [] 变量
  • @RishabhAgarwal 开始一个新问题。
【解决方案2】:

argv 是一个字符串数组,或者说是一个char * 数组。所以argv[1]的类型是char *argv[1][0]的类型是char

【讨论】:

    【解决方案3】:

    argv 的典型声明是

    char* argv[]
    

    这是一个char* 的数组。现在char* 本身在这里是一个指向以空结尾的char 数组的指针。

    所以,argv[1] 的类型为 char*,它是一个数组。因此,您需要另一个应用程序 [] 运算符来获取该数组的元素,类型为 char

    【讨论】:

    • 什么?这没有意义
    【解决方案4】:

    让我们看看 mains 的签名:

    int main(int argc, char *argv[])
    

    不,argv 不是一维数组。它是一个二维字符数组。

    1. argv[1] 返回 char*

    2. argv[1][0] 返回argv[1] 中的第一个字符

    【讨论】:

      猜你喜欢
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 2016-04-16
      相关资源
      最近更新 更多