【发布时间】:2011-09-01 16:57:20
【问题描述】:
我是 C++ 的新手,当我遇到一个非常奇怪的问题时,我正试图解决 Project Euler 中的一个问题。我将错误减少到以下内容。
考虑以下简单代码:
#include <iostream>
using namespace std;
int main() {
int numdigits;
cout << "digits: ";
cin >> numdigits;
char tmpchar;
cin >> tmpchar;
cout << atoi(&tmpchar) << endl;
return 0;
}
基本上,如果第一个输入(numdigits)低于 48,一切正常,但如果输入为 48 或更大,如果有非常奇怪的行为:
air:programming santi$ ./lol
digits: 30
3
3 <--- OK
air:programming santi$ ./lol
digits: 48
3
30 <--- Not OK
air:programming santi$ ./lol
digits: 49
3
31 <--- Not OK
air:programming santi$ ./lol
digits: 50
3
32 <--- Not OK
发生了什么事?我很生气地试图在算法中找到错误,直到我发现错误出现在我没有费心去看的那部分代码中。
提前致谢!
【问题讨论】:
-
你想做什么?为什么输出是
NOT OK?什么是预期的输出?atoi()需要NULL终止的 c 样式字符串,这可能是问题所在。紧跟在tmpchar之后的内存未初始化,可以是任何内容。 -
请注意,显示此行为的数字应为 48-57,但有时也应为 9-13、43、45、46。(否则可能导致程序崩溃)