【问题标题】:argv in C++ clearup [closed]C++ 清除中的 argv [关闭]
【发布时间】:2016-04-08 04:04:32
【问题描述】:

所以我有这个分配(输入一个字符串,它将显示字符串的数量),我必须解释为什么 argv[0] 值和 argv[3] 值会发生变化。因此,当您逐步执行程序时(我的字符串输入是“run how now brown cow”,argv[0] 从我的目录文件夹开始(“/home/013/w/wn/%$%$%#%/Assignment4/ p2")。然后 argv[3] 以“now”开头。我不明白为什么这些变量在程序运行时会发生变化,因为“now”字符串应该在 argv[2] 中,对吧?每当我的程序编译出来的argv[]数组,最后什么都对应,为什么不是开头呢?

代码如下:

#include <stdio.h>

/* print a given string and a number in a pre-determined format. */
void
print_string(int num, char* string)
{
    printf("String '%d' - '%s'\n", num, string);
}

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

    /* check for command line arguments */
    if (argc < 2) { /* 2 - 1 for program name (argv[0]) and one for a param. */
       printf("Usage: %s [<string> ...]\n", argv[0]);
        return(1);
    }

    /* loop over all strings, print them one by one */
    for (argc--,argv++,i=0 ; argc > 0; argc--,argv++,i++) {
        print_string(i, argv[0]);  /* function call */
    }

    printf("Total number of strings: %d\n", i);

    return 0;
}

【问题讨论】:

  • argv[0] 是用于调用程序的文件名,实际的命令行参数存储在argv[1...]
  • @BenVoigt 打败了我
  • 程序运行时它们会发生变化,因为您实际上修改了参数 (argc--,argv++),这是一种通常不受欢迎的样式。
  • 字符串没有改变......你正在改变你自己指向它们的指针(你正在推进开始指向 argv[0] 的指针,然后在 argv++ 之后它指向 argv[ 1]等)正如@BenVoight所说,这是一种令人困惑的风格。通常,您会想要做类似for (int i = 0; i &lt; argc; ++i) { /* do something with argv[i] */ }
  • 是的,当我看到 for 循环的结构时感觉很奇怪。我猜教授只是想迷惑我们哈哈。谢谢大家!

标签: c++ unix argv argc


【解决方案1】:

数组索引从0 开始,argv 的第一个元素是执行文件的路径,例如,如果您像这样执行二进制文件:

./test run how now brown cow

您将在argv 中获得以下元素:

argv[0] = "./test"
argv[1] = "run"
argv[2] = "how"
argv[3] = "now"
argv[4] = "brown"
argv[5] = "cow"

如您所见,现在完全正确的是第三个元素而不是第二个元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 2013-01-24
    相关资源
    最近更新 更多