gpt4 book ai didi

c - 使用 printf 打印不带空字符的字符串

转载 作者:行者123 更新时间:2023-11-30 18:44:59 25 4
gpt4 key购买 nike

我昨天参加了 Google Code Jam 2019 第 1C 轮。以下是部分代码。

char str[5]={r1,r2,r3,r4,r5};
printf("%s\n", str);

法官给出了错误的答案。但是如果我添加行 str[5]='\0';在打印语句之前,它有效。

实际上我检查了运行程序,它似乎打印正常。那么,我可以知道为什么法官给出了错误的答案以及哪里出了问题吗?谁能帮忙告诉我打印带有空字符和不带有空字符的字符串的区别?有人可以确认它是否总是给出正确的结果吗?

最佳答案

C 字符串按照约定以 null 结尾。这意味着 printf 或任何其他接收 C 字符串的函数将读取指向的内存,直到遇到空字符。

在您的情况下,str 中没有空终止符,因此 printf 将继续从接下来的内存中读取。这是未定义的行为。当您自己尝试时,很幸运在 str 之后紧跟着 null,因此 printf 就停在了前面。如果你不太幸运,你可能会遇到垃圾或段错误。这可能就是法官执行代码时发生的情况。

请注意,str[5] = '\0' 也是未定义的行为,因为 str[5] 超出了数组的大小。

有效的替代解决方案:

包含空终止符:

char str[6]={r1,r2,r3,r4,r5,0};

或者将缓冲区的大小传递给printf:

printf("%.5s\n", str);

或者:

printf("%.*s\n", (int)sizeof(str), str);

或者使用fwrite:

fwrite(str, 1, sizeof(str), stdout);
fputc('\n', stdout);

关于c - 使用 printf 打印不带空字符的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55988643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com