gpt4 book ai didi

c - 多维数组中的字符串没有终止 NUL 字符?

转载 作者:行者123 更新时间:2023-11-30 19:34:18 24 4
gpt4 key购买 nike

我尝试打印多维数组的每个字符串,但在我看来,这些字符串没有 NUL 字符('\0')。

这是我使用的代码:

int main(void)
{
char test[3][2] = {'1', '2', '3', '4', '5', '6'};

printf("'%s'\n", test[0]);
printf("'%s'\n", test[1]);
printf("'%s'\n", test[2]);
return 0;
}

输出如下:

'123456'
'3456'
'56'

以这种方式声明它会产生相同的输出:

char    test[3][2] = {"12", "34", "56"};

我必须自己在每个字符串后面放置一个 NUL 字符:

int main(void)
{
char test[3][3] = {'1', '2', 0, '3', '4', 0, '5', '6', 0};
printf("'%s'\n", test[0]);
printf("'%s'\n", test[1]);
printf("'%s'\n", test[2]);
return 0;
}

我也可以这样声明我的多维数组:

char    test[3][3] = {{'1', '2'}, {'3', '4'}, {'5', '6'}};

输出:

'12'
'34'
'56'

这就是我所知道的:声明字符串时不需要在其末尾声明 NULL 终止字符。 str[3] = "123" 将分配 4 个内存槽,而不是 3 个,并将 '\0' 放在最后一个槽中。

以下链接证实了这一点:http://www.lysator.liu.se/c/c-faq/c-2.html

但是为什么我们需要在数组内部的字符串末尾手动实现 NUL 字符呢?

最佳答案

两者

char    test1[3][2] = { "1", "3", "5" };

char    test2[3][3] = { "12", "34", "56" };

会起作用的。

如果你用一对引号(")包围一个或多个字符,编译器就会知道你声明了一个字符串,并且它总是会在字符串末尾分配一个额外的'\0',消耗一个额外的字节内存空间。这就是为什么我们总是声明具有一个额外字节空间的数组用于已知用途,例如使用数组 char sz[6] 来存储字符串“hello”。

另一方面,如果用一对单引号 (') 括住一个字符,例如'a',它将被视为普通值,与int nNum相同。 'a'nNum 之间的唯一区别是内存消耗('a' 为 1 个字节,而 nNum是 4 个字节)。我们可以将两者混合在一个计算中,而无需强制类型转换,例如

int nNum = 1; 
nNum = nNum + 'a';

这会将 97(字符“a”的 ascii 值)添加到 nNum 本身,将 nNum 变成 98。如果继续打印 nNum 像这样:

 printf("%c", nNum);

您将打印出字符'b'

关于c - 多维数组中的字符串没有终止 NUL 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44110046/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com