为什么字符串使用char*?

Uns*_*ned 21 c c++

为什么C/C++ stdlibs中的大多数字符串函数都需要char*指针?

的签署岬char在标准甚至没有规定,但最现代的编译器(GCC,MSVC)对待char作为默认签名.

什么时候将字符串视为(可能)有符号字节?AFAIK在任何字符集中都没有低于零的有意义的字符值.对于某些字符串操作,unsigned char无论如何都必须强制转换值.

那么为什么stdlibs会使用char*?甚至C++特定的方法,如string::string(const char *);

Jer*_*fin 10

  1. 我很确定大多数字符串函数早于存在unsigned char.
  2. Plain char可以是signed或unsigned类型.C和C++标准明确地允许任一个(它总是一个单独的类型从任一unsigned charsigned char,但具有相同的范围内的一个或另一个).
  3. C字符串函数使用时char *,std::string是大多数C++中使用的.


Gre*_* E. 10

C标准对于普通char是签名还是未签名的问题是不可知的,并且独特地char区别对待signed char.此外,基本ASCII字符集包括大多数主要控制字符和英语可打印字符,由128个字符组成,因此可以通过签名char(至少在每个字节提供8位的任何系统上)来充分表示.正如Jim Balter指出的那样(参见下面的评论),ASCII并不构成C语言的完整基本字符集,但我怀疑它确实包含了大多数常用字符.还存在大量C代码,其依赖于(但不一定是唯一的)ASCII的属性(例如,NUL具有零值的特殊字符,按顺序和按升序排列的字母数字字符等).

  • 我不知道你在哪里发现了问题中的错误前提.问题实际上是非常有效的,答案与历史有关.如果PDP-11有将字节作为无符号值处理的指令,则字符将是无符号的,并且处理字符的错误代码会少得多(例如,ctype.h的每次调用都是......或者...函数传递了一个char). (2认同)

Che*_*Alf 5

吉姆巴尔特在评论中指出

处理字节的PDP-11上的指令将它们视为有符号数量,这就是早期C编译器如何处理它们,而无符号甚至不存在.

我强烈怀疑这是为什么默认字符类型char不需要无符号的答案,但是为了确定,需要从一些书面历史帐户引用.

至于为什么不要求它进行签名或者(!),非二进制补码机器上,这样的(唯一一个我知道这可能仍在使用)一个的ClearPath Dorado的,一个signed char不能容纳的所有值unsigned char,因为它在负零上浪费了一个位模式,或者用于该位模式的任何位模式.如果char需要签名,那么将一般数据重新解释为一系列char值将是一个问题.因此,在这样的机器char上必须是未签名的,否则软件将不得不进行极端的扭曲来处理它.