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)
尝试输入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匹配一个可选的有符号十进制整数;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)
| 归档时间: |
|
| 查看次数: |
55 次 |
| 最近记录: |