c - 何时在 C 中使用普通 char 类型

标签 c string c99

在纯 C 中,按照标准存在三种不同的“字符”类型:

  • plain char 其符号是实现定义的。
  • 符号字符
  • 无符号字符

我们假设至少是 C99,其中 stdint.h 已经存在(因此您有 int8_tuint8_t 类型作为推荐的替代方案有符号和无符号字符的显式宽度)。

目前对我来说,使用普通的 char 类型似乎只有在您需要连接标准库的函数(例如 printf)时才真正有用(或必要) , 而在所有其他情况下,则应避免。使用 char 在实现上签名时可能会导致未定义的行为,并且出于任何原因您需要对此类数据进行任何运算。

使用适当类型的问题可能在处理例如 Unicode 文本(或任何使用 127 以上的值来表示字符的代码页)时最为明显,否则可以将其作为纯 C 字符串处理。然而,相关的 string.h 函数都接受 char,如果这样的数据类型为 char,那么在尝试解释它时就会出现问题,例如用于能够处理其编码的显示例程。

在这种情况下,最值得推荐的方法是什么?除此之外,是否有任何特殊原因可以推荐使用 char 而不是 stdint.h 的适当固定宽度类型?

最佳答案

char type 用于字符和字符串。它是所有字符串处理函数所期望和返回的类型。 (*) 你真的不应该对 char 做算术运算,尤其不是签名会产生影响的那种。

unsigned char是用于原始数据的类型。例如memcpy()fread()诠释他们的void *参数作为 unsigned char 的数组.该标准保证任何类型也可以表示为 unsigned char 的数组。 .任何其他转换都可能是“信号”,即触发异常。 (ISO/IEC 9899:2011,第 6.2.6 节“类型表示”)。 (**)

signed char是当您需要 char 的有符号整数时大小(用于算术)。


(*):<ctype.h>中的字符处理函数对此有点古怪,因为它们迎合了 EOF(负),因此将字符值“强制”到 unsigned char 中。范围(ISO/IEC 9899:2011,第 7.4 节字符处理)。但是因为可以保证 char可以转换为 unsigned char并按照第 6.2.6 节返回而不丢失信息……你明白了。

char 有符号时有所不同——比较功能类似于 strcmp() -- 标准规定 char被解释为 unsigned char (ISO/IEC 9899:2011,第 7.24.4 节比较函数)。


(**):实际上,很难看出如何将原始数据转换为 char。和返回信号可能是用 unsigned char 做的相同的信号不会发出信号。但是unsigned char是标准部分所说的。 ;-)

关于c - 何时在 C 中使用普通 char 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48091302/

相关文章:

c++ - 为什么 std::string 引用不能带 char*?

c - 带有 -std=c99 的 GCC 提示不知道 struct timespec

c - C中++val++和++*p++的解释

c - GNU-make 4.运行 "Loading Dynamic Objects"的例子

c - 下载 Rails - C 无法编译

Excel VBA : Is there a way to iterate through characters in a specific range?

c++ - 如何用空格替换 std::string 中的所有非字母字符(数字和特殊字符)

c - 在 C99 中使用检查单元测试框架时出现语法错误

c - gcc 的 -Wc90-c99-compat 标志如何工作?

c - 正确查询的 ODBC 中存在语法错误