c++ - 如果前导 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()
首先读取前导零,其余数字留在缓冲区中,这些数字在循环的第二次运行时被拾取。
有人可以暗示发生了什么吗?
我正在使用 XCode 11.3.7 并使用 Clang C++11 进行编译。(我没有弄乱项目设置)
先感谢您!!!
解决方案
使用%lld
而不是%lli
.
%i
不起作用的原因是因为0
被解释为八进制数的前缀,而数字8
和9
八进制中不存在:
d
匹配可选带符号的十进制整数;下一个指针必须是指向 int 的指针。
i
匹配一个可选的有符号整数;下一个指针必须是指向 int 的指针。如果整数以 0x 或 0X 开头,则以 16 为基数读取,如果以 0 开头,则以 8 为基数读取,否则以 10 为基数读取。仅使用与基础相对应的字符。
对于其他数字,您也会得到错误的答案,例如010
八进制将被解析为 8。
或者,甚至更好:使用 C++ 而不是 C。
std::cin >> a[i];
推荐阅读
- xml - 试图在同一个 XML 文档中使用 XSLT 和 Key 函数查找相关值
- android - 可以看到任何图像
- go - 未能验证 ECDSA 签名
- android - 使用 camera2api 捕获多张图像会使预览在拍照时暂停片刻
- android - Android 仅字母数字,以编程方式(非 XML)
- python - 使用 Python 解析 XML 并打印整个元素
- http - 谷歌云负载均衡器不返回内容编码:gzip
- python - 删除 CSV 文件中不是以 python 中的数字开头的所有行
- sas - SAS PROC SQL - 如何将字符串转换为日期
- python - 在不同条件下在一行中接收不同数量的返回值