在声明一个角色的数组时是否需要提供空字符?

时间:2014-04-25 07:27:02

标签: c arrays string

C中的字符串常量存储为字符数组,而按元素创建这样的数组元素时,是否需要提供空字符。

我需要存储一个字符串常量,比如S[number]= "hello\n"。字符串常量在C中存储为字符数组,此外,这样的字符串由空字符'\0'终止。在将短语存储在数组中时,是否需要考虑空字符并分配额外空间,或者我只需要提及需要存储的字符数?

3 个答案:

答案 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字符。