我正在学习 C,目前正在尝试在变量中存储字符串。我将以下内容放在一起尝试不同的东西。
#include <stdio.h>
int main() {
char *name = "Tristan";
char today[] = "January 1st, 2016";
char newyear[] = {'H','a','p','p','y',' ','N','e','w',' ','Y','e','a','r','!','\n'};
printf("Hello world!\n");
printf("My name is %s.\n", name);
printf("Today is: %s.\n", today);
printf(newyear);
return 0;
}
编译此代码并运行后,我得到以下结果:
Hello world!
My name is Tristan.
Today is: January 1st, 2016.
Happy New Year!
January 1st, 2016
现在这几乎是我所期望的,为什么“2016 年 1 月 1 日”会在程序输出的末尾再次打印出来?
如果我从“newyear”数组中取出“\n”,它就不会这样做。
有人可以解释一下这是为什么吗?
最佳答案
newyear
缺少尾随空字节,因此 printf
是未定义的行为。
只有字符串文字隐式附加空字节。您显式初始化每个字符,因此不会附加空字节。
未定义的行为意味着在这种情况下标准未定义的事情将会发生。这包括什么也没发生,你大哭起来,或者,是的,打印了一些字符串两次。
只要在数组中添加一个额外的字符,即空字节即可解决问题:
char newyear[] = {'H','a','p','p','y',' ','N','e','w',' ','Y','e','a','r','!','\n', '\0'};
请注意,没有一个理智的人会使用这样的字符串初始化自动 char
数组。只需坚持字符串文字即可! (不过,我认为您这样做只是为了学习目的。)
关于c - 开头 C : Behavior Printing Strings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34558765/