【问题标题】:Scanf for two integers separated by space with Enter key interruptionScanf 使用 Enter 键中断以空格分隔的两个整数
【发布时间】:2017-03-20 05:49:58
【问题描述】:

我需要从用户那里得到两个用空格分隔的整数。问题是,如果他们只输入一个整数并按 Enter,我需要打印出他们必须输入两个值并要求他们再次输入的消息。

scanf("%d %d", &a,&b);

这就是我扫描输入的方式。这段代码在一个 while 循环中,所以基本上我一直在向他们询问 2 个有效数字。它工作得很好,但是如果我只输入 1 int 并按 Enter 键,直到我最终输入第二个整数之前什么都不会发生。 制作两个 scanf() 不是一个好主意,因为我需要用空格分隔值。 如果用户按 Enter 键,还有其他方法可以破坏 scanf() 吗? 我只需要使用 scanf()。

【问题讨论】:

    标签: c scanf


    【解决方案1】:

    解决办法是不要使用scanf。相反,请使用更合适的函数,例如 fgets,它读取以 Enter 终止的单行输入。获得输入行后,您可以使用sscanf 提取整数(或任何其他您喜欢的方法)。

    scanf 函数几乎不是交互式输入的合适选择。

    【讨论】:

    • 这个问题我见过很多解决方法但是需要使用scanf()。
    • @Alex:嗯,scanf 根本没有做你想做的事。
    • 我想这绝对是 scanf 的一个缺点。它一直等到用户最终输入 2 个值。将接受此建议不要使用 scanf。
    【解决方案2】:

    scanf返回值是一个整数,可以查看成功扫描了多少个参数:

    if (scanf("%d %d", &a,&b) != 2) {
       // error case
    }
    

    http://www.cplusplus.com/reference/cstdio/scanf/。阅读返回值文档

    【讨论】:

    • 我只能在 scanf() 之后检查这个条件,但是在这种情况下,如果我不输入第二个整数,scanf() 将永远不会结束。如果我只输入 1 个 int,我可以按任意多个 Enter,这就是问题所在。
    • scanf 的返回值在这里没有帮助,因为在用户仅输入第一个数字后按 Enter 的情况下,scanf 函数不会返回。只有在输入第二个数字后才会返回。
    【解决方案3】:

    scanf("%d", &a); 在扫描int 时会占用前导空格,并且无法区分空格和输入'\n'

    所以scanf()首先是主角

    for (;;) {
      char buf[2];
      if (scanf("%1[ ]", buf) == 1) Handle_leading_space();
      else if (scanf("%1[\n]", buf) == 1) Handle_leading_enter();
      else break;
    }
    // Now scan for an `int`
    if (scanf("%d", &a) == 1) Handle_int(a).
    

    以上不处理制表符、回车和其他空格。

    另一种选择,只寻找所有非数字的东西。

    char buf[2];
    while (scanf("%1[^-+0123456789]", buf) == 1) {
      Handle_non_numeric(buf);
    }
    // Now scan for an `int`
    if (scanf("%d", &a) == 1) Handle_int(a).
    

    IMO,最好用fgets() 阅读然后解析。不使用fgets() 可能会带来代码挑战,但对于实际程序来说并不是一个很好的限制。

    【讨论】:

      猜你喜欢
      • 2012-05-12
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多