如何解决如果前导0后面的数字是8或9,Scanf不会读取前导0
我有一个非常奇怪的问题,源于我一直在编写的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;
}
尝试输入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()
似乎首先读取了前导零,而其余的数字则留在缓冲区中,并在循环的第二次运行中被拾取。 / p>
有人可以暗示发生了什么事吗?
我正在使用XCode 11.3.7并使用Clang C ++ 11进行编译。 (我没有弄乱项目设置)
提前谢谢!!
解决方法
使用%lld
代替%lli
。
%i
不起作用的原因是因为0
是interpreted作为八进制数字的前缀,而数字8
和9
却不t以八进制形式存在:
d
匹配一个可选的带符号十进制整数;下一个指针必须是指向int的指针。
i
匹配一个可选的带符号整数;下一个指针必须是指向int的指针。如果整数以0x或0X开头,则以16为基数;如果以0开头,则以8为基数;否则以10为基数。仅字符 使用与基础相对应的。
对于其他数字,您也会得到错误的答案,例如八进制的010
将被解析为8。
或者,甚至更好:使用C ++代替C。
std::cin >> a[i];
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。