在哪里读取cmd输入,例如“ myapp.exe输入”或“ myapp.exe-?” (我使用cmd)

时间:2019-06-04 08:15:14

标签: c

当我使用Java时,我需要输入诸如java -?之类的命令,如果用户最后键入-?,为什么应用程序知道此内容以回复输出?请告诉我c代码以识别-?

4 个答案:

答案 0 :(得分:1)

它们作为参数传递给main():

#include <stdio.h>

int main(int argc, const char* argv[])
{
    for (int i = 0; i < argc; i++) {
        printf("Arg %i is %s\n", i, argv[i]);
    }
}

编译后执行为

myProgram.exe arg1 stuff ?

它将输出

Arg 0 is myProgram.exe
Arg 1 is arg1
Arg 2 is stuff
Arg 3 is ?

答案 1 :(得分:1)

C中,您有main签名的三个选项。第一个是不带任何参数int main(void)的参数。注释中提到的第二个int main()采用任意数量的参数,但未命名。但是,第三个参数有两个参数int main(int argc, char **argv),参数的名称并不重要,它们只是常用的。这两个参数用于向程序提供命令行参数。

  • argc:是计数器变量,用于保存所提供参数的数量,以空格分隔
  • argv:将命令行参数包含为c字符串数组

您的程序始终隐式接收一个参数,即应用程序的名称(如果主机环境无法提供,则为\ 0)。这里有一个关于如何遍历参数的小例子:

#include <stdio.h>

int main(int argc, char **argv) {
    for(int i = 0; i < argc; i++) {
        printf("%s\n", argv[i]);
    }
}

答案 2 :(得分:0)

在C中,main声明为:

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

第一个参数是参数的数量,第二个参数是参数的数组,因此,例如,您可以这样做:

#include<string.h>
#include<stdio.h>

#define QUESTION_MARK "-?"

int main(int argc, char **argv){
    if(argc > 1){
        char *qsmark = argv[1];
        if(strcmp(qsmark, QUESTION_MARK) == 0){
            printf("argv[1] is -?\n");
        }
    }
    return 0;
}

请记住,第一个argv是可执行文件的名称。 但是,请避免手工比较字符串,请使用标准库获取qsmark所指向的内容实际上是否等于“-?”

答案 3 :(得分:0)

如果可以使用getopt()或其他类似的POSIX函数。那么这是一种方法:

#include <stdlib.h>
#include <stdio.h>
#include <getopt.h>

int main(int argc, char** argv)
{
    int opt;

    while ((opt = getopt(argc, argv, "h?")) != -1)
    {
        switch (opt)
        {
        case '?':
        case 'h':
            printf("Usage: bla bla\n");
            break;    
        }
    }

    return EXIT_SUCCESS;
}

示例:

~ # /tmp/temp_test -?
Usage: bla bla

~ # /tmp/temp_test -y
/tmp/temp_test: invalid option -- 'y'
Usage: bla bla
~ #

更多信息,man page