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

C++ 如果前导0后的数字为8或9,则Scanf不读取前导0,c++,c++11,scanf,stdin,C++,C++11,Scanf,Stdin,我有一个非常奇怪的问题,它源于我一直在编写的C++11程序的一个bug 请参阅以下代码: 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; }

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

请参阅以下代码:

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;
}
尝试输入1、2等,我们会得到预期的输出1\n、2\n等。这也适用于输入,如001,得到1\n,0004,得到4\n

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

例如:

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

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

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

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

有人能暗示发生了什么事吗

我使用的是XCode 11.3.7,并使用C++11进行编译。我没有弄乱项目设置

提前谢谢你

使用%lld而不是%lli

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

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

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

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

或者,甚至更好:用C++代替C.</P>

std::cin >> a[i];
使用%lld而不是%lli

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

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

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

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

或者,甚至更好:用C++代替C.</P>

std::cin >> a[i];