c ++将char转换为int的奇怪问题

cur*_*ial 4 c++ atoi

我是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;
}
Run Code Online (Sandbox Code Playgroud)

基本上,如果第一个输入(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
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?我疯狂地试图找到算法中的错误,直到我发现错误出现在代码的那部分,我没有先去看.

提前致谢!

NPE*_*NPE 7

问题出在这里:

char tmpchar;
cin >> tmpchar;
cout << atoi(&tmpchar) << endl;
Run Code Online (Sandbox Code Playgroud)

atoi期待一个以NUL结尾的字符串,这不是你给它的字符串(除了你有时偶然得到一个字符之外没有NUL字符).

可能(丑陋)修复是:

char tmpchar[2] = {0};
cin >> tmpchar[0];
cout << atoi(tmpchar) << endl;
Run Code Online (Sandbox Code Playgroud)

如果你正在处理多字符串,那么使用std::string将是要走的路:

std::string str;
cin >> str;
cout << atoi(str.c_str()) << endl;
Run Code Online (Sandbox Code Playgroud)


Naw*_*waz 5

atoi(&tmpchar)
Run Code Online (Sandbox Code Playgroud)

我认为这只会调用未定义的行为.由于类型&tmpchar就是char*这是正确的C-string类型,但它不是空teminated字符串.

你为什么不这样做:

int i = tmpchar - '0';
cout << i << endl; //prints whatever single-digit you enter for tmpchar
Run Code Online (Sandbox Code Playgroud)

或者,如果要打印ASCII值tmpchar,请执行以下操作:

int i = tmpchar;
cout << i << endl; //prints the ASCII value of tmpchar
Run Code Online (Sandbox Code Playgroud)

甚至更简单:

cout << (int) tmpchar << endl; //prints the ASCII value of tmpchar
Run Code Online (Sandbox Code Playgroud)