【问题标题】:Using a single scanf() to take in different variations of user input in C使用单个 scanf() 来接受 C 中用户输入的不同变化
【发布时间】:2021-11-04 17:45:44
【问题描述】:

基本上,我的程序所做的是从用户那里获取多行输入,并在用户退出程序时显示一个图表。我遇到的问题是用户输入信息的方式有不同的变化,例如:“L 200000”或“J 3.5 12”。对于输入本身就是 scanf() 解释它的方式,我没有太多问题。我知道,如果我做了 scanf("%s" "%i", &identifier, &number) ,它对于第一个示例会工作得很好,但是一旦用户输入三个单独的值,单个 scanf() 就不再工作了。所以我的问题是,我如何让 scanf() 忽略缺失值但仍然能够将其赋予预定义变量的事实?除了scanf()还有其他方法吗?

【问题讨论】:

  • 不要为此使用scanf。它只是不太适合这样的任务。使用诸如fgets 之类的替代方法来读取整行,然后使用strtok 来解析每个标记。或者阅读第一个字符,它大概描述了随后的数据格式,然后可能是scanf。但仍然建议不要使用scanf,因为在任何重要的用例中都很难做到正确。
  • 输入带有fgets 的行并应用sscanf 调用,首先转换假定的3 个输入,然后在失败时转换2 个输入。你怎么知道它失败了?通过测试成功的转换次数(其函数返回值),这在使用任何scanf 函数系列时是必不可少的
  • 请澄清您的具体问题或提供更多详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: c syntax scanf


【解决方案1】:

除了scanf()还有其他方法吗?

停止使用scanf()。它不能很好地处理格式错误的数据,离开stdin 对于替代处理来说是一个具有挑战性的状态。

使用fgets() 将用户输入的 读入字符串 - 然后处理字符串。

#define EXPECTED_LINE_LENGTH_MAX 100
char buf[EXPECTED_LINE_LENGTH_MAX*2 + 1];  // Be generous
if (fgets(buf, sizeof buf, stdin)) {
  

现在为各种格式解析 buf
使用" %n"存储扫描的偏移量对于检测尾随垃圾非常有用。

  int n = 0;
  int identifier;
  double number
  if (sscanf(buf, "L %d %n", &identifier, &n) == 1 && buf[n] == '\0') {
    puts("Found L data");
  } else if (sscanf(buf, "J %lf %d %n", &number, &identifier, &n) == 2 && buf[n] == '\0') {
    puts("Found J data");
  } else  {
    puts("Fail");
  }
}

【讨论】:

    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多