char 变量是否总是用 {'x',\0} 表示为取消引用的 char*[2]?

Is char variable always represented as dereferenced char*[2] with {'x',}?

本文关键字:char 引用 取消 表示 是否 变量      更新时间:2023-10-16

我尝试了这种方法将字符数字转换为整数数字('3'->3),它似乎有效。

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

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

在第一个字符之后总是有一个NULL字符吗?

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

int i = c - '0';

注意我使用的是GCC 4.8.2和MinGW。

可以编译,但这是未定义的行为。

A char只是一个字符。后面没有空字节。std::atoi期望一个空字节,所以调用std::atoi(&c)编译,但产生未定义的行为。这条线,

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

是定义良好的,因为字符串"x"char[2]并且以null结尾。

int i = c - '0';

是正确的,因为1 c++ 11标准和C99标准2保证了字符数字的顺序。


1正如@ShafikYaghmour在对你的问题的评论中所指出的

2再次感谢@ShafikYaghmour !

atoi期望以空结尾的c字串。

因为你没有提供它(你提供了一个指向字符的指针),这是未定义的行为。

用于第二行代码—如果您可以保证该字符确实是数字,则这通常有效。例如,字符#将产生一个结果,但可能不是您期望的结果。

一些解决方案是使用std::stoi:

try{ int x = std::stoi(std::string() + c) } catch(...) {/*handle*/}

只要分配c的内存空间旁边是就可以工作。换句话说,这只是运气。你应该使用int i = c - '0'

但是要注意每个字符都将被映射为int(例如:int i = 'a' - '0')

要避免这种情况,你可以这样做:

int i = c=>'0' && c<='9' ? c-'0' : -1; //-1 represents not valid values
相关文章: