- 此问题在此处已有答案**:
(9个答案)
How should character arrays be used as strings?(4个答案)
昨天关门了。
我使用strlen
来获取字符数组sentence
的长度。
当我运行下面的代码时,sentence
的length
输出为12,尽管它只有10个字节宽:
/* mre.c */
#include <stdio.h>
#include <string.h>
int
main (void)
{
int length, i, beg;
char sentence[10] = "this is 10";
length = strlen (sentence);
printf ("length: %d\n", length);
for (i = 0; i < length; i++)
{
beg = 0;
}
return 0;
}
$ gcc mre.c && ./a.out
length: 12
删除beg = 0;
后,将返回预期结果:
一个二个一个一个
我注意到如果我在Emacs的shell中一次打印sentence
一个字符,我会看到两个额外的字符:
/* mre.c */
#include <stdio.h>
#include <string.h>
int
main (void)
{
int length, i, beg;
char sentence[10] = "this is 10";
length = strlen (sentence);
printf ("length: %d\n", length);
for (i = 0; i < length; i++)
{
beg = 0;
printf ("%c", sentence[i]);
}
return 0;
}
$ gcc mre.c && ./a.out
length: 12
this is 10\0\0
我不知道该如何解释这件事。
2条答案
按热度按时间vlju58qv1#
char sentence[10] = "this is 10";
不考虑作为字符串文字字符数组一部分的终止'\0'
。char sentence[10 + 1] = "this is 10";
将向代码的读者证明,您至少知道并尝试解释允许将字符数组用作C“字符串”的“\0”。更好的办法是:
char sentence[] = "this is a sentence";
,允许编译器分配它所知道的所需空间。使用最后一种格式,您可能会发现
strlen(mystr)
总是比sizeof mystr
的值小1。附言:
re:
[10 + 1]
-初学者可能不太清楚。阅读代码的人会看到这种对细节的关注,并很高兴看到这种努力。编译器将对常量执行算术运算,发出的代码将只包含值11
,而不是在运行时重新计算总数的代码。wa7juj8i2#
C中的字符串是字符数组,以
\0
结尾,而\0
本身是一个字符。因此,如果你想要一个包含10个字符的句子,你必须声明数组的大小至少为11。因此,当你使用strlen
函数时,它会计算字符数,直到遇到\0
。如果你将数组大小改为11,即使注解掉beg = 0
,它也会将长度打印为10