我知道在C语言中有两种不同的方法来初始化字符串。
char str[] = "abcd";
char str[] = {'a','b','c','d','\0' };
明显地,写"abcd"
比{'a','b','c','d','\0' }
更省时间且更舒适。
我们能像最后一行那样初始化字符串的原因是什么?它在某些情况下有用还是多余的?
我知道在C语言中有两种不同的方法来初始化字符串。
char str[] = "abcd";
char str[] = {'a','b','c','d','\0' };
明显地,写"abcd"
比{'a','b','c','d','\0' }
更省时间且更舒适。
我们能像最后一行那样初始化字符串的原因是什么?它在某些情况下有用还是多余的?
puts("\xAAABBA");
不会编译,因为它将\x
后面的所有内容都视为十六进制数。char str[] = {'\xAA','A','B','B','A','\0'}; puts(str);
就可以正常工作。(不过您也可以将字符串字面值分成几部分,以达到相同的效果:"\xAA" "ABBA"
。)
- 使用字符串字面值进行初始化还存在C语言中微妙但严重的缺陷,参见这里:Inconsistent gcc diagnostic for string initialization。char *s = "hello";
- chqrliechar str[] = {'a','b','c','d','\0' }
"这种形式很少用于初始化真正的字符串,这是事实。 < /p >
< p >我曾经写过一些代码来过滤生成的文本中意外的粗俗词汇,并且在自我审查时,我以一种不会冒犯任何未来维护程序员眼睛的方式初始化了要查找的单词数组:
char badwords[][5] = {
{ 's', 0x68, 105, 0164, '\0' },
{ 'p', 0151, 0x73, 115, '\0' },
{ 'c', 117, 0156, 0x74, '\0' },
{ 'f', 0x75, 0143, 107, '\0' },
/* ... */
};
char badwords[] = { "shiW", "piVs", "cXnW", "fXFk"}
这样的东西,可以在运行时使用基于if(isupper(*p) *p = tolower(*p-3)
的东西进行解码。(或者只使用rot13)。 - Steve Summit
char* str = {'a','b','c','d','\0' };
,但是你可以使用char* str = "abcd";
,因为后者首先创建一个未命名的数组,然后将str
指针分配给它,而前者只是一个等待初始化为数组的字符列表。 - George