【问题标题】:Command line arguments that has options [duplicate]具有选项的命令行参数[重复]
【发布时间】:2018-04-23 23:03:18
【问题描述】:

所以我必须编写一个程序,其中包含两个可能的选项,具体取决于用户通过输入 -i 或 -w 选择的选项。一般来说,我对命令行参数很陌生,我不知道该怎么做。到目前为止,我有:

#include <stdio.h>

int main(int argc, char *argv[])
{
    if(argc == -'i') {
        puts("Test 1");
    }

    else if(argc == -'w') {
        puts("Test 2");
    }  

return 0;
}

它不打印任何东西... 非常感谢任何解释。我只是想了解这背后的逻辑。

【问题讨论】:

  • argc参数计数argv 是存储参数数据的参数向量。您正在查看 sn-p 中的 参数计数

标签: c command-line


【解决方案1】:

首先,您将橙子与苹果进行比较。 argc 存储数量 论据。其次,即使您使用argv[1],比较仍然是 错了,因为它会比较指针,而不是内容。请注意,在 C 字符串是终止于'\0'-终止字节的字符序列。 char* 变量仅指向该序列的开头。 == 运算符 检查值的相等性,如果是指针(和字符串文字),它 比较两个指针是否指向同一个位置。

当你想比较字符串时,你必须比较字符串本身, 这意味着您必须比较指针指向的内容。 对于字符串,您必须像这样使用strcmp 函数:

#include <stdio.h>

int main(int argc, char *argv[])
{
    if(argc != 2)
    {
        fprintf(stderr, "usage: %s option\n", argv[0]);
        return 1;
    }

    if(strcmp(argv[1], "-i") == 0)
        puts("Test 1");
    else if(strcmp(argv[1], "-w") == 0)
        puts("Test 2");
    else {
        fprintf(stderr, "Invalid option '%s'\n", argv[1]);
        return 1;
    }

    return 0;
}

请注意,首先检查您是否有足够的命令行很重要 参数(我的代码的第一个if)。如果用户没有传递任何参数, argc 将是 1,argv[1] 将指向 NULL,这将产生 undefined 传递给strcmp 时的行为。这就是为什么我只做strcmp的原因 100% 确定 argv[1] 不是 NULL

另外,如果您正在为 POSIX 系统(linux、mac 等)进行编码,那么我建议您使用 getopt 用于解析命令行参数。

【讨论】:

  • 这似乎解释了命令行参数的数量由 argument count (argc) 给出,并带有指向每个参数的指针(存储为 argument vector (*argv[]) 中提供的以 nul 结尾的 字符串)有助于理解概念。
【解决方案2】:

您必须检查 argv[i] 其中 i 是要放入的命令行参数的数组编号,argv[0] 将是调用的文件名,之后 argv[1] 将是第一条语句, argv[2] 下一个等等

【讨论】:

    【解决方案3】:

    argc 表示“参数计数”。表示参数的数量

    argv 是一个二维数组。字符串是 C 中的一维字符数组。第二维来自于你有多个字符串。

    因此,如果您想要第一个 String 参数,您可以按如下方式访问它:

    argv[0]
    

    您还尝试比较长度超过 1 个字符的字符串。您应该使用strcmp 来比较C 中的字符串。请参阅How do I properly compare strings?

    如果你想比较相等,你不会使用==== 用于基本数据类型,例如intchar

    【讨论】:

      【解决方案4】:

      argc 表示在命令行中传入的参数个数,包括程序名本身。

      在 c 中,一个字符,例如 'i' 是一个 8 位数字,表示字母 i 的 ASCII 码。因此,您的条件语句if(argc == -'i') 实际上是在检查 -105(105 是字母 i 的 ascii 值)是否是传递给程序的参数数量。

      要检查传入的参数是"-i" 还是"-w",您需要使用c 库函数或您自己的算法执行字符串比较,并且您需要将这些字符串与argv[i] 进行比较(其中我是您在程序调用中检查的参数的位置)

      【讨论】:

        【解决方案5】:
        #include <stdio.h>
        
        int main(int argc, char *argv[])
        {
            printf("The name of the program is %s\n", argv[0]);
            if( strcmp(argv[1], "-i") == 0 ) { puts("Test 1"); }
            if( strcmp(argv[1], "-w") == 0 ) { puts("Test 2"); }  
        
        return 0;
        }
        

        【讨论】:

        • 如果没有传递参数,那将失败,因为它会用NULL 调用strcmp
        • 请编辑此问题以描述此代码的作用,以回应问题的具体情况。 stackoverflow.com/help/how-to-answer
        猜你喜欢
        • 2018-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-28
        • 2020-07-20
        • 2012-10-26
        相关资源
        最近更新 更多