我尝试使用此方法将char数字转换为整数位('3' - > 3),它似乎有效。
char c='x';
int i=atoi(&c);
我的问题是,这总是有效吗?
第一个字符后是否总是有一个空字符?
使用隐式类型转换还有另一种方法可以做到这一点,但我不确定这是一个好习惯。实际上,我很惊讶即使使用-Wall和-Wextra也没有任何警告。
int i = c - '0';
注意我正在使用GCC 4.8.2和MinGW。
答案 0 :(得分:5)
这会编译,但它的行为是未定义的。
char
只是一个角色。没有空字节跟随。 std::atoi
期望一个空字节,因此调用std::atoi(&c)
编译但会产生未定义的行为。这一行,
int i = std::atoi("x");
但是,是明确定义的,因为字符串"x"
是char[2]
并且以空值终止。
int i = c - '0';
没问题,因为 1 C++11 standard和C99 standard 2 保证字符数字的顺序。
@ShafikYaghmour在你的问题评论中指出1
2 再次感谢@ShafikYaghmour!
答案 1 :(得分:1)
atoi
期望空终止的C-string。
因为你没有提供它(你提供了一个指向字符的指针),这是未定义的行为。
代码的第二行 - 如果你能保证这个字符确实是一个数字,这通常有用。例如,字符#
将产生结果,但可能不是您期望的结果。
一些解决方案是使用std::stoi
:
try{ int x = std::stoi(std::string() + c) } catch(...) {/*handle*/}
答案 2 :(得分:0)
只要在分配c的内存空间旁边是\ 0,这就可以工作。换句话说,这只是运气。您应该使用int i = c - '0'
但请注意,每个字符都将映射到int(f.e。int i = 'a' - '0'
)
为避免这种情况,您可以执行以下操作:
int i = c=>'0' && c<='9' ? c-'0' : -1; //-1 represents not valid values