Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将字符串定义为char*vs unsigned char*_C - Fatal编程技术网

将字符串定义为char*vs unsigned char*

将字符串定义为char*vs unsigned char*,c,C,我正在使用这个库,它有一个特殊的“字符串类型”,定义为PCRE2\u SPTR8 如果我尝试使用以下内容初始化字符串: PCRE2_SPTR8 s = "my string"; PCRE2_SPTR8 s = (PCRE2_SPTR8) "my string"; 我会得到一个警告,比如: warning: initializing 'PCRE2_SPTR8' (aka 'const unsigned char *') wit

我正在使用这个库,它有一个特殊的“字符串类型”,定义为
PCRE2\u SPTR8

如果我尝试使用以下内容初始化字符串:

PCRE2_SPTR8 s =   "my string";
PCRE2_SPTR8 s =   (PCRE2_SPTR8) "my string";
我会得到一个警告,比如:

warning: initializing 'PCRE2_SPTR8' (aka 'const unsigned char *') 
         with an expression of type 'char [27]' converts between pointers to
         integer types with different sign [-Wpointer-sign]
建议用什么方法初始化这种类型的字符串?做一些类似于:

PCRE2_SPTR8 s =   "my string";
PCRE2_SPTR8 s =   (PCRE2_SPTR8) "my string";
另外,出于好奇,为什么一个普通的“字符串”通常被定义为
char*string=“something”
而不是
无符号字符*string=“something”。使用有符号和无符号字符定义字符串有什么优点/缺点吗

建议用什么方法初始化这种类型的字符串

类似于OP的想法,当
PCRE2\u SPTR8
不是
char*
,但更常见的是避免隐藏
*
。由于这是一个风格问题,请遵循团队的风格指南

// PCRE2_SPTR8 s =   (PCRE2_SPTR8) "my string";
const unsigned char * =  (unsigned char *) "my string";

另外,出于好奇,为什么一个普通的“字符串”通常被定义为
char*string=“something”
而不是
无符号字符*string=“something”

在C语言中,标准库将字符串定义为:

字符串是以第一个空字符结尾并包含该空字符的连续字符序列

最好保持接近这个定义
char*string
不是字符串,而是指向字符串的指针。类似于wise for
无符号字符*字符串


有符号的
定义字符串与用
无符号的字符
定义字符串相比,有什么优点/缺点吗

字符串函数的C库的行为就像字符串元素是
无符号字符

对于本子条款中的所有函数,应将每个字符解释为具有类型
无符号字符
(因此,每个可能的对象表示都是有效的,并且具有不同的值)

这在选择大小写(如
strcmp()
中)和比较两个字符(可能有一个字符超出ASCII范围)时非常重要。这些值的比较就像
无符号字符
一样。在今天很少使用2的补码的平台上也很重要

在实现类似字符串的函数时,最好使用
unsigned char
实现


调用字符串函数时,最好使用
char
,以尽量减少强制转换的需要。

char
很奇怪,因为某些原因,编译器可以将其视为默认有符号或默认无符号。同样地,您的字符常量将继承这一点,强制使用unsigned可能会破坏一切。@tadman您能想到的一些原因是什么?不同的观点现在僵化为C标准。因为C标准将
char
是有符号的还是无符号留给实现。请参阅(这只是他们发现折磨C程序员的另一种方式:)
@carl.hiass在C中,
int,long,short
无符号
是有符号的。将这一想法扩展到char,它也会被签名,这似乎很自然。然而,有符号的
char
对于非2的补码来说是非常有问题的,因为现在有两个0编码(或者更糟的是一个陷阱)。这类机器的
char
是无符号的。与ASCII 0-127不同,它还使用了0-255个字符的编码,并使用了无符号的
字符
。C折衷:
char
是一种不同于
signed char
unsigned char
的类型,并匹配其中一种字符的范围/大小。我认为这大约涵盖了
:)