代码之家  ›  专栏  ›  技术社区  ›  Yuval Adam

可选从C中的stdin读取

c
  •  2
  • Yuval Adam  · 技术社区  · 15 年前

    我的应用程序基本上是一个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 回复  |  直到 15 年前
        1
  •  3
  •   leeeroy    15 年前

    简单的方法:

       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 {
           // :-/
          }
        }
    
        2
  •  2
  •   anon    15 年前

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

        3
  •  1
  •   Juliano    15 年前

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

        4
  •  0
  •   Jared Forsyth appas    15 年前

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

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