当前位置:  开发笔记 > 编程语言 > 正文

开始C:行为打印字符串

如何解决《开始C:行为打印字符串》经验,为你挑选了1个好方法。

我正在学习C,目前正在尝试在变量中存储字符串.我把以下内容放在一起尝试不同的东西.

#include 
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",它就不会这样做.

有人请解释这是为什么吗?



1> cadaniluk..:

newyear错过一个尾随的空字节,所以printf它是未定义的行为.
只有字符串文字隐式附加一个空字节.您显式初始化每个字符,因此不会附加空字节.

未定义的行为意味着标准在此时不会定义的内容将会发生.这包括什么都没发生,你泪流满面,或者是,打印一些字符串两次.

只需在数组中添加一个额外的字符,即空字节即可解决问题:

char newyear[] = {'H','a','p','p','y',' ','N','e','w',' ','Y','e','a','r','!','\n', '\0'};

请注意,没有理智的人char使用类似的字符串初始化自动数组.只要坚持字符串文字!(我认为你这样做只是为了学习目的.)

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有