可选从C中的STDIN读取

时间:2010-04-18 19:14:18

标签: 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

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

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

4 个答案:

答案 0 :(得分:3)

简单方法:

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

答案 1 :(得分:2)

简单回答,你不能。 C运行时从OS获取输入,但不控制它。要做这样的事情,您需要使用特定于平台的API直接与操作系统进行交互。

答案 2 :(得分:1)

你在逐行阅读吗?在你到达“\ n”(换行符)之前,你不能只读完整个命令吗?如果你在换行符之前得到两个令牌,那就是命令和参数;如果你只读一个,它只是命令,你将第二个参数设置为默认值。

答案 3 :(得分:0)

这是一个有效的程序(对不起,我之前的回答是急速的)。

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将评估是否输入了一个或两个令牌。