char 变量是否总是用 {'x',\0} 表示为取消引用的 char*[2]?
Is char variable always represented as dereferenced char*[2] with {'x', }?
我尝试了这种方法将字符数字转换为整数数字('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
相关文章:
- 将 char 指针传递给接受对 char 数组的引用的函数
- 枚举类的 C 样式强制转换到基础类型 char 的引用
- 成员引用基类型 'char' 不是 C++ 中的结构或联合
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 为什么要使用引用来获取 *char?当我们使用指针时,不使用引用不是更好吗?
- gtest - 未定义对"testing::InitGoogleTest(int*, char**)"的引用
- Qt5 对'QApplication::QApplication(int&, char**, int)'的未定义引用
- 悬空指向 int 和 char* 常量的指针/引用
- 来自类型为std::basic_string::const_iterator的非常量引用的无效初始化,并且<char>来自类型std::basic_string<char>::
- 类型为'std::string&的非常量引用的初始化无效,并且从类型为'std::basic_string<char>的右值
- 将 C++ 转换为 Python 通过引用返回无符号 char*
- 使用cout,如何将char转换为变量的地址/引用(?)
- 从运算符[]返回对映射的char*的引用
- Arduino:未定义的对"I2CRW::readByte(unsigned char, unsigned char)"的引用
- C# PInvoke - 返回 char* 和引用 char* 参数的函数
- 链接器错误(未定义的引用)与“静态 constexpr const char*”和完美转发
- 对'icu_56::UnicodeString::UnicodeString(signed char, unsigned short const*, int)' 的未定义引用
- 如何创建一个32位int和四个8位char类型的并集,每个类型都引用32位int的差分片
- __FILE__可以由C++中的const char*引用
- 从类型为"char*"的临时引用初始化类型为"char*&"的非常量引用