【问题标题】:Scanf reads numbers wrong in certain formatsScanf 在某些格式中读取错误的数字
【发布时间】:2021-11-29 11:54:49
【问题描述】:

我注意到这段代码在某些情况下会读取错误的值。

#include <stdio.h>

int main()
{
    int a, b;

    printf("Enter 2 numbers:");
    scanf("%2d:%2d", &a, &b);

    printf("\n\n %d:%d", a, b);
}

代码应该读取两个 2 位数字,如果输入类似于“15:33”,它可以正常工作,但是,当输入是“151:33”时,输出应该再次是“15:33”,而是,它的“15:32764”。

这里发生了什么?

【问题讨论】:

  • scanf 的结果(实际返回值)并不是偶然出现的。它会告诉你成功解析的参数数量,你最好检查一下,而不是幸福地假设 IO 只是“工作”。
  • 阅读文档,它描述了如何阅读“除了':'之外的任何东西”。

标签: c scanf


【解决方案1】:

你告诉scanf() 会有两个数字,一个“:”和两个数字。
在所描述的失败的情况下,这是不正确的。
Scanf 告诉你这一点(在返回值中;我敢肯定)——但你忽略了它。

您告诉我们的是“有两个数字,然后是任何数字,可能重复,然后是':',然后是另一对数字,然后可能更多”,如果我误读了您的解释,请告诉我。
如果您阅读文档,您可以告诉scanf()
(https://en.cppreference.com/w/c/io/fscanf)
注意^ 说明符。它允许您定义“除 ':' 之外的任何内容”。 scanf 的其他功能将允许您忽略该部分。然后您可以期待“:”,然后是第二对数字,就像您显示的代码一样。
您可能希望在最后期望并忽略另一组不需要/可忽略的输入字符,如果您尝试在循环中执行此操作,这将很重要。

例如,这个基本版本让您输出 12:45 输入 123:456 并输出 'Oops.' 以获得更奇怪的东西。

#include <stdio.h>

int main()
{
    int a, b;

    printf("Enter 2 numbers:");
    if(2!=scanf("%2d%*[^:]:%2d", &a, &b))
    {
        printf("Oops.\n");
    } else
    {
        printf("\n\n %d:%d", a, b);
    }
}

例如这里https://www.onlinegdb.com/online_c_compiler

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 2019-02-17
    • 2015-09-08
    • 1970-01-01
    • 2021-10-29
    相关资源
    最近更新 更多