繁体   English   中英

从STDIN的C语言中可选读

[英]Optional read from STDIN in C

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

我正在这样做:

char cmd[64];
scanf("%s", cmd);
int arg;
scanf("%d", &arg); // but this should be optional

如果提示中当前没有可用的整数参数,该如何读取它并将其设置为默认值? 如果原始命令中没有给出提示,我不希望提示等待其他输入。

我尝试了使用fgetc()getchar()多个版本,并将它们与EOF进行比较,但无济于事。 我尝试的每个版本最终都会等待该可选的整数参数。

简单的方法:

   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 {
       // :-/
      }
    }

简单的答案,你不能。 C运行时从操作系统获取输入,但不对其进行控制。 为此,您将需要使用平台特定的API直接与操作系统进行交互。

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

这是一个有效的程序(对不起,我先前的回答是匆忙做出的)。

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);
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM