如果前导 0 后的数字是 8 或 9,则 Scanf 不读取前导 0

Rya*_*ang 1 c++ stdin scanf c++11

我有一个非常奇怪的问题,它源于我一直在编写的 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;
}
Run Code Online (Sandbox Code Playgroud)

尝试输入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 进行编译。(我没有搞乱项目设置)

先感谢您!!!

Tho*_*mas 6

使用%lld代替%lli

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

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

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

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

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

std::cin >> a[i];
Run Code Online (Sandbox Code Playgroud)