我正在尝试在屏幕上打印一些字符。我使用了很多错误的实现方式。例如:
示例1:
#include <stdio.h>
int main(int argc, char const *argv[]) {
char hello[6] = {'h', 'e', 'l', 'l', 'o', '\n'};
char bye[5] = {'b', 'y', 'e', '\n', '\0'};
char end[] = "end";
char dot = '.';
char oops[] = {'o', 'o', 'p', 's'};
printf("%s\n", hello);
printf("%s\n", bye);
printf("%s\n", end);
printf("%s\n", dot);
printf("%s\n", oops);
return 0;
}
输出1:
问题:
为什么在dot
之前先打印bye
字符?
dot
字符后的这些垃圾是什么?
示例2(已删除的dot
声明/定义,打印:
#include <stdio.h>
int main(int argc, char const *argv[]) {
char hello[6] = {'h', 'e', 'l', 'l', 'o', '\n'};
char bye[5] = {'b', 'y', 'e', '\n', '\0'};
char end[] = "end";
char oops[] = {'o', 'o', 'p', 's'};
printf("%s\n", hello);
printf("%s\n", bye);
printf("%s\n", end);
printf("%s\n", oops);
return 0;
}
输出2:
问题
垃圾仍然存在!我对他们感觉很好,但是为什么end
被打印两次?
我设法在每次使用终止符时都正确地使用了终止符,但是为什么在打印时会出现这种不一致的现象?我来自Java背景,已经感到很奇怪!
您的第一个字符串数组不是以null结尾的。
之所以得到奇怪的输出,是因为您的行为不确定。处理字符串的函数(包括使用%s
格式说明符和printf
打印它们)期望它们以null终止,否则会出现不确定的行为。如果发生这种情况,则无法保证任何特定的输出。它可以按预期工作,可以提供奇怪的输出,可以使程序崩溃或执行其他操作。通常使用打印字符串,它将一直继续打印,直到出现访问冲突并且崩溃,或者遇到下一个空字节(这很可能早早发生,直到发生)才打印出“垃圾”。 。