C语言 不同的字符串取决于其他变量赋值[重复]

vs3odd8k  于 2023-01-12  发布在  其他
关注(0)|答案(2)|浏览(134)
    • 此问题在此处已有答案**:

(9个答案)
How should character arrays be used as strings?(4个答案)
昨天关门了。
我使用strlen来获取字符数组sentence的长度。
当我运行下面的代码时,sentencelength输出为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

我不知道该如何解释这件事。

vlju58qv

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,而不是在运行时重新计算总数的代码。

wa7juj8i

wa7juj8i2#

C中的字符串是字符数组,以\0结尾,而\0本身是一个字符。因此,如果你想要一个包含10个字符的句子,你必须声明数组的大小至少为11。因此,当你使用strlen函数时,它会计算字符数,直到遇到\0。如果你将数组大小改为11,即使注解掉beg = 0,它也会将长度打印为10

相关问题