c++将char转换为int的奇怪问题
c++ weird problem converting a char to int
我是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;
}
基本上,如果第一个输入(数字(低于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
发生了什么事?我疯狂地试图在算法中找到错误,直到我发现错误出现在代码的那一部分,而我一开始就懒得看。
提前感谢!
问题就在这里:
char tmpchar;
cin >> tmpchar;
cout << atoi(&tmpchar) << endl;
atoi
需要一个以NUL结尾的字符串,但这并不是你给它的(没有NUL字符,只是你有时可能偶然得到一个(。
一个可能的(丑陋的(修复是:
char tmpchar[2] = {0};
cin >> tmpchar[0];
cout << atoi(tmpchar) << endl;
如果您要处理多个字符串,那么使用std::string
将是一种方法:
std::string str;
cin >> str;
cout << atoi(str.c_str()) << endl;
atoi(&tmpchar)
我认为这只会引发未定义的行为。因为&tmpchar
的类型是char*
,这是正确的c字符串类型,但它不是空字符串。
你为什么不简单地这样做:
int i = tmpchar - '0';
cout << i << endl; //prints whatever single-digit you enter for tmpchar
或者,如果您想打印tmpchar
的ASCII值,请执行以下操作:
int i = tmpchar;
cout << i << endl; //prints the ASCII value of tmpchar
或者更简单:
cout << (int) tmpchar << endl; //prints the ASCII value of tmpchar
atoi()
采用NUL('\0'(终止的字符指针。您将它指向第一个字符,但不能保证第二个字符是NUL。请尝试以下操作。
#include <iostream>
using namespace std;
int main() {
int numdigits;
cout << "digits: ";
cin >> numdigits;
char tmpchar[2];
cin >> tmpchar[0];
tmpchar[1] = ' ';
cout << atoi(tmpchar) << endl;
return 0;
}
atoi
采用以null结尾的字符串作为参数。这是一个字符数组,末尾有一个null字符("\0"(。
+---+---+---+
|'1'|'0'| | = "10"
+---+---+---+
您正在传递单个字符的地址。但是没有终止的空字符!
+---+---+---+
|'3'| ? | ? | = ?
+---+---+---+
这是未定义的行为,这就是为什么你会得到奇怪的结果。
你可以通过一种安全的方式从一个数字字符中获得一个数字,比如:
int number = digit - '0';
atoi
的参数必须是以null结尾的字符数组,而不仅仅是指向一个字符的指针。
char tmpchar[2] = {0};
cin >> tmpchar[0];
cout << atoi(&tmpchar) << endl;
这里{0}将所有数组元素设置为0,cin
读取第一个,第二个字符保持为null,因此&tmpchar
将指针指向以null字符结束的字符数组。
相关文章:
- 指针问题:从不兼容的类型"int"分配给"int *"
- 替代在python中制作邻接列表与图形问题的字典?(如 C++ 中的 vector<vector<int&g
- C++初始化具有 int 0 问题的unique_ptr
- 我正在编写一个代码来将 int 数组存储在文件中,然后用 c++ 检索它,但是检索第一项是假值,我该如何解决这个问题?
- 调用 Parse int 函数时编译 parse 整数程序时出现问题
- C++ 标准::矢量<int>问题
- 当我向 vector<int *> 添加元素时,我遇到了一些问题
- 无符号int的比较始终是正确的(NPOS问题?)
- C++. 面试. 关于返回 int* 值问题的范围
- 将输入分配给字符串,int数组和int的问题
- 从ints向量删除int的问题
- 将字符串转换为 int 问题
- C++ vector<pair<int,int>> std::all_of() 函数问题(重定向到头文件)
- 将功能与"int main"问题分开(初学者)
- 类型转换<int>的舍入问题
- openssljava到c++读取int问题
- 矢量字符串、int 和 dword 问题
- 使用 int*&通过引用传递指针会导致奇怪的问题
- int*&x 的问题
- const int&performance 问题