【问题标题】:String size is equal to number of characters字符串大小等于字符数
【发布时间】:2013-10-09 21:42:39
【问题描述】:

我正在制作一个基本的字符串程序并做到了这一点。有这样一个字符串:

#include<stdio.h>
int main()
{
    char str[7]="network";
    printf("%s",str);
    return 0;
}

它打印network。在我看来,它不应该打印网络。应该打印一些垃圾值,因为'\0' 没有结束这个字符数组。那么它是如何打印出来的呢?也没有警告或错误。

【问题讨论】:

  • 你很幸运,当你打印 str 时,"network" 提供的 '\0' 没有被其他任何东西覆盖。
  • 我不会这么快就接受答案。没有一个答案能真正解决您的问题。
  • 在 c++ 中,字符串数组必须比字符总数大一,但在 c 中,情况并非如此。

标签: c arrays string printf


【解决方案1】:

堆栈页面可能在您的系统中一开始就完全归零,因此字符串实际上在内存中以空值结尾,但这要归功于您的代码。

尝试使用调试器查看内存中的程序,阅读您的平台文档或打印出str[7] 的内容以获得一些线索。这样做会调用未定义的行为,但当您试图弄清楚您的特定编译器和操作系统在某个给定时间点正在做什么时,它是无关紧要的。

【讨论】:

  • 在 windows 7 的 turbo c 和 ubuntu 的 gcc 上试过。我得到了同样的答案。我可以为他们使用哪个调试器
  • 实际上 strcpy 和 strcmp 就可以了。它的行为就像一个字符串。
  • 同样,操作系统将零页映射为堆栈空间是完全合理的。这意味着您不写入的任何字节都将保持为零。只需启动 Visual Studio 或 GDB 并查看“字符串”之后的内存空间。
【解决方案2】:

那是因为

char str[7]="network";

相同
char str[7]={'n','e','t','w','o','r','k'};

str 是一个有效的char 数组,但不是字符串,因为它不是以空值结尾的。所以使用%s 打印它是未定义的行为。

参考:C FAQ: Is char a[3] = "abc"; legal? What does it mean?

【讨论】:

  • 所以因为 \0 没有结束字符数组,字符串减少为字符数组。
  • @mrigendra 关键是它不是一个有效的 C 字符串,所以你不能使用%sprintf 中打印它。未定义的行为可能导致任何结果。
  • so if char arr[7]="hello my netowrk";它会打印前 7 个字符,因为它现在是一个字符数组。但它显示错误。
  • @mrigendra 请参阅我链接的 C 常见问题解答文章。这有帮助吗?
【解决方案3】:
char str[7]="network";

你没有为字符串提供足够的空间

char str[8]="network";

【讨论】:

  • 这与 Gangadhar 在他的回答中提供的完全一样。
【解决方案4】:
char str[7]="network"; 

这会调用Undefined behavior

你没有声明足够空间的数组

这应该是

char str[8]="network";  

【讨论】:

  • 不,str 的定义不是未定义的行为,它不是字符串,而是有效的char 数组。
  • 是的,打印它会调用未定义的行为
  • 定义也错误。因为 OP 想要将 8 个字符放入 7 个字符数组的长度中。因为长度小于 required ,忽略 Null 并使这个无效字符串。然后打印非空终止的字符串调用UB。
  • 当您尝试将其打印为%s 时会发生未定义的行为,假设它是一个字符串,而定义不会发生。
  • @YuHao 对不起,我写错了,因为UB.Definition是合法的但是错误的。不能用作字符串,可以用作char数组。
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 2017-12-29
相关资源
最近更新 更多