【问题标题】:Scanf does not read leading 0s if digit after leading 0s are 8 or 9如果前导 0 之后的数字是 8 或 9,则 Scanf 不会读取前导 0
【发布时间】:2020-09-10 14:11:51
【问题描述】:

我有一个非常奇怪的问题,源于我一直在编写的 C++11 程序的一个错误。

见以下代码:

long long a[1000];
int main(int argc, char * argv[]) {
    
    for(long long i = 0; i < 300; ++i) {
        scanf("%lli", &a[i]);
        std::cout << a[i] << std::endl;
    }
    
    return 0;
}

尝试输入 12 等,我们会得到输出 1\n2\n 等,如预期的那样。这也适用于像001 这样的输入,我们得到1\n0004 我们得到4\n

但是,当前导零后面的数字是 8 或 9 时,scanf() 先读取前导零,然后再读取后面的数字。

例如:

输入:0009,输出:000\n9\n

输入:08,输出0\n8\n

输入:00914,输出00\n914\n

我已经进行了一些测试,对于这些情况,scanf() 似乎首先读取前导零,其余数字留在缓冲区中,这些数字在循环的第二次运行时被拾取。

有人可以暗示发生了什么吗?

我正在使用 XCode 11.3.7 并使用 Clang C++11 进行编译。 (我没有弄乱项目设置)

提前谢谢你!!!

【问题讨论】:

    标签: c++ c++11 scanf stdin


    【解决方案1】:

    使用%lld 而不是%lli

    %i不起作用的原因是因为0interpreted作为八进制数的前缀,而数字89不存在八进制:

    d 匹配可选带符号的十进制整数; next 指针必须是指向 int 的指针。

    i 匹配一个可选的有符号整数;下一个指针必须是指向 int 的指针。如果整数以 0x 或 0X 开头,则以 16 为基数读取,如果以 0 开头,则以 8 为基数读取,否则以 10 为基数读取。只有字符 使用与基础相对应的。

    您也会得到其他数字的错误答案,例如八进制的010 将被解析为 8。

    或者,甚至更好:使用 C++ 而不是 C。

    std::cin >> a[i];
    

    【讨论】:

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