c - 开头 C : Behavior Printing Strings

标签 c

我正在学习 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/

相关文章:

c - 程序无法在eclipse上运行

python - 在 Numpy C 扩展中返回可变长度数组?

c - dirent 不使用 unicode

c - 我已经编写了这段代码,但没有得到输出,任何人都可以帮我解决这个问题吗?

c - 如何读取多行字符串并打印偶数位字符和奇数位字符,每行中用空格分隔

c - 释放内存、函数

C 从文件中读取 X 个字节,如果需要则填充

c - 为什么增值如此不确定?

C二叉搜索树插入指针问题

c - UndefinedBehaviorSanitiser 问题 - CS50 Vigenere