【问题标题】:Printing character array in C [duplicate]在C中打印字符数组[重复]
【发布时间】:2015-08-27 20:17:17
【问题描述】:

我知道我应该把 '/o' 放在字符数组的末尾,但是 当我想打印“printf ("%s\n", kk);”时,它给出“abcdepqrst”。为什么会这样? 这是我正在执行的程序。

#include<stdio.h>
int main()
{

char kk[]={'a','b','c','d','e'};
char s[]="pqrst";

printf("%s\n",s);

printf("%s\n",kk);

}

输出:

pqrst

abcdepqrst

我尝试通过在此处的数组“kk”之前声明数组“s”来颠倒声明数组的顺序,ideone link,但我仍然得到相同的输出。我认为这与 ideone 如何为变量分配内存有关。

#include<stdio.h>
int main()
{
char s[]="pqrst";
char kk[]={'a','b','c','d','e'};


printf("%s\n",s);

printf("%s\n",kk);

}

输出:

pqrst

abcdepqrst

【问题讨论】:

标签: c arrays memory data-segment


【解决方案1】:

printf() 函数需要一个以空值结尾的字符串,但您传递的是一个没有空值终止符的字符数组。尝试将您的数组更改为:

char kk[]={'a','b','c','d','e','\0'};

当您使用字符串字面量语法初始化s 数组时,会自动添加空终止符:

char s[] = "pqrst"; // s is {'p','q','r','s','t','\0'}

【讨论】:

  • 请检查编辑。
  • 所有这些反对票的意义何在?
  • @EugeneSh.;小心鬼魂!!
  • @juanchopanza 所说的行为是否未定义。
  • @c0de222 是的,这是未定义的行为,通常您只会在未终止的字符串之后看到内存中的任何内容,直到恰好是 0 字节或您导致访问冲突。在您的情况下,编译器已选择将您的另一个字符串 s 紧跟在内存中的 kk 之后。
【解决方案2】:

kk 不是以空值结尾的,所以printf 不知道在哪里停止。在非空终止的字符串上调用printf未定义的行为 (UB)。这意味着您不能期望您的程序有任何特定的结果。你看到的是UB的一种表现。

您需要添加一个空终止符:

char kk[]={'a','b','c','d','e', '\0'};

【讨论】:

  • 好的。所以我们不能期待一个特定的输出?
  • @c0de222 对,UB 意味着几乎任何事情都可能发生。
  • 但实际上,它只会打印内存中从kk 开始的所有内容,直到遇到第一个零。在您的情况下,s 结尾。由于skk 在堆栈上分配,它会“向后”。
【解决方案3】:

您需要向 kk 添加一个 '\0' 字符,因为它是最后一个元素,如下所示:

char kk[]={'a','b','c','d','e','\0'};

或者 printf 会跑出数组的末尾。

【讨论】:

  • 请检查编辑。
  • 我对您的问题发表了评论,并附有一个答案的链接,可以清除概念。
  • 感谢您的链接。
猜你喜欢
  • 2016-12-07
  • 1970-01-01
  • 2012-01-03
  • 2014-12-21
  • 2015-12-13
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
相关资源
最近更新 更多