【问题标题】:accepting user inputs from the standard input where the amount of variable inputs could vary接受来自标准输入的用户输入,其中可变输入的数量可能会有所不同
【发布时间】:2017-02-23 05:51:51
【问题描述】:

我想接受来自标准输入的变量,但我不想定义我接受多少变量,以便用户可以提交两个或三个变量。

例如我会:

char key;
char name1[100];
char name2[100];


printf("Hello! insert your command:\n");
scanf("%c %s %s",&key, name1, name2);

但是用户不需要插入第二个名字,这样输入的“F John”和“L John Doe”“X”都会被接受。基本上我不希望预先确定输入长度,我只需要它接受 1 2 或 3 个变量。 scanf 是正确的方法还是有更好的方法?

目前它等待分配所有 3 个变量

【问题讨论】:

    标签: c scanf


    【解决方案1】:

    scanf 是正确的方法还是有更好的方法?

    是的,scanf 完全适合这个。但是,您需要注意您在格式字符串中使用的空格不是;它们具有不同的含义,因为它们不仅匹配单个空格,还匹配任何零个或多个空格字符(包括空格、制表符、换行符)。你会想要使用 %*1[^ ] 指令,而不是。为清楚起见,您可以将其定义为 #define SPACE_FORMAT "%*1[^ ]",并按如下方式使用:

    int n = scanf("%c" SPACE_FORMAT "%s" SPACE_FORMAT "%s", &key, name1, name2);
    

    仔细注意我是如何将返回值存储到n中的;如果scanf成功匹配并分配给:

    • 只有第一个对象(&key 指向),它只会返回 1...
    • 第一个(&key 指向)和第二个(name1 指向)对象,它将返回 2...
    • ... 等等。如果scanf 由于某些读取错误或到达EOF 而失败,它将返回EOF(它是一个负整数)。

    【讨论】:

      【解决方案2】:

      您可以使用fgets() 读取整个输入字符串,然后将sscanf() 从字符串中读取到变量中。 sscanf() 返回成功读取的字段数。您可以使用此数字来决定哪些变量已被初始化。

      char buffer[100];
      int n;
      printf("Hello! insert your command:\n");
      fgets(buffer, sizeof(buffer), stdin);
      n = sscanf(buffer, "%c %s %s", &key, name1, name2);
      # 1, 2 or 3
      

      正如评论中所指出的,该行的其余部分也将被读取(最多100-1=99 个字符)。我假设该行的其余部分没有更多感兴趣的领域。

      【讨论】:

      • 请注意,这确实有细微的不同,因为它不仅会读取一个字符和两个 单词(在英语词汇意义上,由空格分隔的标记),而且还会读取行尾(最多 99 个字符,此时如果需要,您将需要丢弃超过 99 个字符直到下一个 '\n',因此您需要更多代码)...这可能是可取的或不可取的,但无论如何,这是一个通常不会被注意到的细微差别。
      • @Seb 正确。我假设除了最多三个名称组件之外没有其他内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多