C中的字符串常量存储为字符数组,而按元素创建这样的数组元素时,是否需要提供空字符。
我需要存储一个字符串常量,比如S[number]= "hello\n"
。字符串常量在C中存储为字符数组,此外,这样的字符串由空字符'\0'
终止。在将短语存储在数组中时,是否需要考虑空字符并分配额外空间,或者我只需要提及需要存储的字符数?
答案 0 :(得分:6)
如果你打算使用C字符串函数,比如strlen,那么回答是 YES 。您的字符串应该以null结尾。如果你介绍自定义函数来处理字符串 - 你可以随意存储它。
值得一提的是,如果使用字符串常量创建数组,则会自动为空字符保留空间。例如。输出以下代码:
char s[] = "hello";
printf("%d", sizeof(s) / sizeof(char));
是
6
对于'h,'e','l','l','o'为5,对于'\ 0'为1。
答案 1 :(得分:4)
在将短语存储到数组中时,是否需要考虑空字符并分配额外的空格,或者我只需要提及需要存储的字符数?
是,您应该计算空字符以分配额外的空间。你必须在这里注意重点:
S[number]= "hello\n";
如果\0
值等于(或大于)字符串S[]
的长度,则将number
添加到"hello\n"
数组中{1}}或者如果你根本不给出\0
的大小。
来自:ISO / IEC 9899:201x委员会草案2011年4月12日N1570:
6.7.9 [Initialization]
[...]
14:字符类型数组可以由字符串文字或UTF-8字符串文字初始化,可选地用大括号括起来。字符串文字的连续字节(包括终止空字符如果有空间或数组未知大小 )初始化数组的元素。
[..]
例8声明s[] = "hello\n";
定义``plain'' char数组对象s和t,其元素使用字符串文字初始化。该声明与:
相同char s[] = "abc", t[3] = "abc";
数组的内容是可修改的。另一方面,声明
char s[] = { 'a', 'b', 'c', '\0' }, t[] = { 'a', 'b', 'c' }; // you are missing this point
定义
char *p = "abc";
类型p
数组char''长度为4,其元素用字符串文字初始化。如果尝试使用p修改数组的内容,则行为未定义。
所以我对你的问题发表评论:这取决于你在声明中声明的pointer to char'' and initializes it to point to an object with type
的价值。 可以添加number
char(在大多数情况下)或可能不会添加(在一个有效的声明中)。这是非常重要的一点,大多数答案都缺失了。
更珍贵:
注意'\0'
是六个char长字符串(包括字符串终止nul char "hello"
)
'\0'
与:
相同S[6]= "hello";
但是
S[6]= {'h', 'e', 'l', 'l', 'o', '\0'};
// ^ is 6
在C中有效,但不要追加 nul S[5]= "hello";
个字符。它相当于:
\0
现在请注意,在此声明中,如果声明中的大小为5 = 5,则可以使用循环将字符打印为S[5]= {'h', 'e', 'l', 'l', 'o'};
// ^ is 5
,但不能使用{{1或者像for(i = 0; i < sizeof(S); i++)
上的strcpy这样的函数 - 使用此调用未定义的行为。
除此之外,我还建议您在编译代码时始终使用-Wall和-pedantic标志。现在看看它是如何工作的:
让我们使用%s
编译此代码:
S[]
您将收到如下警告:
char s[4] = "hello";
但代码在C中有效且int main(){
char s[4] = "hello";
int i = 0;
for (i = 0; i < sizeof s; i++)
printf("%c", s[i]);
printf("\n");
return 0;
}
编译相同的代码,它不会向您发出任何警告,这也暗示它是有效的代码,但显然它不会添加$ gcc -Wall -pedantic x.c
x.c: In function ‘main’:
x.c:3:15: warning: initializer-string for array of chars is too long
[enabled by default]
。< / p>
char s[5] = "hello";
检查一下(你应该注意到这次编译器没有发出任何警告):
\0
但是这次我们应该使用#include <stdio.h>
int main(){
char s[5] = "hello";
int i = 0;
for (i = 0; i < sizeof s; i++)
printf("%c", s[i]);
printf("\n");
return 0;
}
来调用未定义的行为。
因此,当您使用字符串文字创建数组时,最好避免声明中的大小,如:
$ gcc -Wall -pedantic x.c
@:~$ ./a.out
hello
但这与printf("%s", s);
相同而您无法将新的字符附加到 char s[] = "hello";
char s[6] = "hello";
。
如果您打算在代码中修改s[]
后者,那么您可能希望创建一个足够大的字符串:
strcat(s, " world!")
现在s[]
是完全有效的代码。
答案 2 :(得分:2)
不,但你应该遗漏number
char S[]= "hello\n";
将包含尾随0字符,并根据需要调整数组大小。
如果number
太小,您可能会意外地切断0字符。