【问题标题】:String Initialization in cc中的字符串初始化
【发布时间】:2015-11-21 10:17:01
【问题描述】:

我对 C 编程很陌生,所以请随时纠正我,我坚持。我对 C 中字符串的基本理解是,当我们初始化一个字符串时,会在字符串的末尾自动分配一个空字符,并且空字符不能被读取或写入,而只能在内部使用。

因此,当我创建一个大小为 4 的字符串 char str[3] 并为其分配一个单词“RED”并使用 puts 函数或 printf("%s",str) 打印它时,我得到一个不寻常的输出,打印为 RED(SMIILEY FACE)

然后我再次将字符串的大小减小到 char str[2] 并将 RED 分配给它,然后对其进行编译,然后再次收到一个输出说明 RE(Smiley face)

如果有人可以向我解释一下,我将不胜感激。下面贴出C代码

    int main()
{

 char s1[3]="RED";
 char s2[]="RED";
 puts(s1);
 puts(s2);
 printf("%s",s1);
 return 0;
}

【问题讨论】:

  • "当我们初始化一个字符串时,会自动分配一个空字符" -- 前提是你为它提供了足够的空间。

标签: c null-character


【解决方案1】:
char s1[3] = "RED";

valid statement。它将常量字符串文字"RED"(4 个字符长)中的3 个字符复制到字符数组s1 中。在s1 中没有终止'\0',因为它没有空间。

注意副本,因为s1 是可变的,而"RED" 不是。这使得语句不同于例如const char *s1 = "RED";,其中字符串没有被复制。

puts(s1)printf("%s", s1) 的结果都是未定义的。 s1 中没有终止 '\0'。将其视为带有 one 的字符串可能会导致任意行为。

char s2[] = "RED";

这里是sizeof(s2) == 4,因为"RED"有四个字符,所以在计算空格的时候需要把后面的'\0'算进去。

【讨论】:

  • char s3[2] = "RED"; 格式不正确
  • 只是对“如果你定义”的一个小问题,如果你声明,'define'应该是完全不同的——但我知道你的意思,所以是quibble这个词。
  • @m-m:你能在标准中指出这一点吗?看起来赋值“减 1”是为 C++ 定义的一个例外,但我不能为了它找到真正有太多元素的情况。
  • @DavidC.Rankin 谢谢。通过删除最后一个示例轻松解决,直到澄清所需的行为是什么。 C99 有一个示例,但仅用于省略终止零。
【解决方案2】:

空字符占用一个额外字符(字节)。因此,除了要初始化的单词中的字符数之外,您还需要使用一个额外的空格。

 char s1[4]="RED"; //3 for RED and 1 for the null character

另一方面

char s2[3]="RED";

空字符没有空格。 “RED”在那里,但在打印它时会遇到 I/O 问题,因为最后没有存储空字符。您的数据存储良好,但由于没有空字符,printf 无法正确识别。

 char s2[]="RED";

这将作为 4(字节)的内存自动分配,其中包括终止空字符的空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多