char变量是否始终表示为带有{'x',\ 0}的解除引用的char * [2]?

时间:2015-10-21 12:44:53

标签: c++ c c++11 casting char

我尝试使用此方法将char数字转换为整数位('3' - > 3),它似乎有效。

char c='x';
int i=atoi(&c);

我的问题是,这总是有效吗?

第一个字符后是否总是有一个空字符?

使用隐式类型转换还有另一种方法可以做到这一点,但我不确定这是一个好习惯。实际上,我很惊讶即使使用-Wall和-Wextra也没有任何警告。

int i = c - '0';

注意我正在使用GCC 4.8.2和MinGW。

3 个答案:

答案 0 :(得分:5)

这会编译,但它的行为是未定义的。

char只是一个角色。没有空字节跟随。 std::atoi期望一个空字节,因此调用std::atoi(&c)编译但会产生未定义的行为。这一行,

int i = std::atoi("x");
但是,

是明确定义的,因为字符串"x"char[2]并且以空值终止。

int i = c - '0';

没问题,因为 1 C++11 standardC99 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