在何处读取cmd输入,如;myapp.exe输入“;或;myapp.exe-?”;(i使用cmd)

在何处读取cmd输入,如;myapp.exe输入“;或;myapp.exe-?”;(i使用cmd),c,C,当我使用Java时,我需要键入类似于Java-?的命令,如果用户在最后键入-?,为什么应用程序知道这一点来回复输出?请告诉我c代码来识别-?它们作为参数传递给main(): 它将输出 Arg 0 is myProgram.exe Arg 1 is arg1 Arg 2 is stuff Arg 3 is ? 在C中,主节点声明为: int main(int argc, char** argv); 第一个参数是参数数量,而第二个参数是参数数组,因此,例如,在您的情况下,您可以执行以下操作: #

当我使用Java时,我需要键入类似于
Java-?
的命令,如果用户在最后键入
-?
,为什么应用程序知道这一点来回复输出?请告诉我c代码来识别
-?

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

它将输出

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

在C中,主节点声明为:

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;
}
#包括
#包括
#定义问号“-?”
int main(int argc,字符**argv){
如果(argc>1){
char*qsmark=argv[1];
如果(strcmp(qsmark,问号)==0){
printf(“argv[1]是-?\n”);
}
}
返回0;
}
请记住,第一个argv是可执行文件的名称。
但是,请避免手动比较字符串,请使用标准库获取qsmark所指内容是否实际等于“-?”

C
中,您的
main
签名有三个选项。第一个是不接受任何参数的参数
intmain(void)
。注释中提到的第二个
int main()
接受任意数量的参数,但它们未命名。然而,第三个参数有两个参数
intmain(intargc,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]);
    }
}
#包括
int main(int argc,字符**argv){
对于(int i=0;i
如果可以使用
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;
}

更多信息,请参见。

从技术上讲,对于一致性实现,它是
int main(void)
,保留参数为空
()
指定了不确定的参数数量。看见(注意:许多嵌入式系统故意不合规,因此它们可能会提供
main
)的替代定义,但也就是说,您的意思很清楚。@DavidC.Rankin好的,谢谢!在使用
C
时,我总是会忘记这一点,在您的示例中,
Arg 4 NULL
;为什么?
argv
是一个指针数组,其中最后一个参数后面的指针设置为
NULL
。我在
C
标准中爬行了一段时间,似乎您对main的定义不是标准的混淆:“参数argc和argv以及argv数组指向的字符串应由程序修改[…]”因此根据标准,
const*argv[]
显然是不正确的。我相信
strcmp()
是您正在查找的
string.h
中的标准库函数。是的,虽然这更多是旁注,但这就是为什么我没有指定它。如果它确实使代码更清晰,我将编辑它。您可以,您的建议很清楚,但请记住,作为老师,您的学生知道的可能比您少来自Java的他不知道什么样的字符串比较函数可用,也不知道在哪里可以找到它们。总是值得至少写一句话,用新发现的知识让它们朝着正确的方向发展。
#include <stdio.h>

int main(int argc, char **argv) {
    for(int i = 0; i < argc; i++) {
        printf("%s\n", argv[i]);
    }
}
#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
~ #