我正在学习C,目前正在尝试在变量中存储字符串.我把以下内容放在一起尝试不同的东西.
#includeint 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
使用类似的字符串初始化自动数组.只要坚持字符串文字!(我认为你这样做只是为了学习目的.)