在C中从标准输入读取可选

在C中从标准输入读取可选,c,C,我的应用程序基本上是一个shell,需要输入类型为cmd[x],其中cmd是常量,x是可选的。因此cmd 1是合法的,而且cmd本身也是合法的-然后我假设x有一个默认参数 我正在这样做: char cmd[64]; scanf("%s", cmd); int arg; scanf("%d", &arg); // but this should be optional 如果提示中当前没有可用的整型参数,如何读取整型参数并将其设置为默认值?如果原始命令中没有给出提示,我不希望提示等待其他输

我的应用程序基本上是一个shell,需要输入类型为
cmd[x]
,其中
cmd
是常量,
x
是可选的。因此
cmd 1
是合法的,而且
cmd
本身也是合法的-然后我假设
x
有一个默认参数

我正在这样做:

char cmd[64];
scanf("%s", cmd);
int arg;
scanf("%d", &arg); // but this should be optional
如果提示中当前没有可用的整型参数,如何读取整型参数并将其设置为默认值?如果原始命令中没有给出提示,我不希望提示等待其他输入


我使用
fgetc()
getchar()
尝试了几个版本,并将它们与
EOF
进行了比较,但没有效果。我尝试的每个版本最终都会等待可选的整数参数。

简单的答案,您不能。C运行时从操作系统获取输入,但不控制它。要做到这一点,您需要使用特定于平台的API直接与操作系统交互。

您正在逐行阅读吗?在到达“\n”(换行符)之前,您不能读取整个命令吗?如果在换行符之前有两个标记,则它是一个命令和参数;如果您只读取一个参数,则它仅为命令,您可以将第二个参数设置为默认值。

简单方法:

   char b[73]; //powers of 2 magic is evil.
    if(fgets(b,sizeof b,stdin) != NULL) {
      char cmd[59]; //59, no command will ever be > 58. Ever I say.
      int arg;
      if(sscanf(b,"%58s %d",cmd,&arg) == 2) {
         //handle cmd and arg
      } else if(sscanf(b,"%58s",cmd) == 1) {
         //handle cmd only
      } else {
       // :-/
      }
    }

这是一个有效的程序(很抱歉,我之前的答案是匆忙做出的)


fgets读取该行(进行边界检查),sscanf将评估是否输入了一个或两个令牌。

否,stdin确实返回EOF,但只有在遇到文件结尾(例如,用户键入Ctrl-D或其他)后才会返回EOF,否则它只会坐在那里等待用户键入内容。这就是我的意思。。。在应用程序的运行上下文中,它将永远不会收到
EOF
,显然,直到终止。EOF在Unix操作系统上是CTRL+D,在Windows上是CTRL+Z。CTRL-D(至少在POSIX上)不会终止应用程序-它在标准输入上标志着文件的结束。Offtopic:Heh!我刚注意到你有10枚金、100枚银和256枚铜徽章。。。你有一些漂亮的整数!这当然是正确的解决方案-首先,你真的不应该使用scanf()进行交互式输入。第二个sscanf是不必要的,如果第一个返回1,它与第二个sscanf具有相同的效果。如果第一个返回1,你如何绝对地、100%肯定地,在任何情况下,编译器、平台、,知道它没有解析'arg'ok,但是在'cmd'上加了条吗?尽管有1个或2个SCCANF,但这仍然是非常不理想的,因为如果用户给出了2个参数,您真的希望向用户报告错误,但是2个参数。无法分析。mk。我以前试过,它说“你想投票赞成删除它吗?”这毫无意义。。。它正在工作。谢谢
int main(){
    char cmd[100], line[100];
    int man = 0;
    printf("OK: ");
    fgets(line, 100, stdin);
    int num = sscanf(line,"%s %d",cmd,&man);
    if (num==1)printf("one! %s %d\n", cmd, man);
    else if (num==2)printf("two! %s %d\n", cmd, man);
}