char数组中的终止符

问题描述 投票:1回答:2

我正在尝试在屏幕上打印一些字符。我使用了很多错误的实现方式。例如:

示例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:

enter image description here

问题:

为什么在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:

enter image description here

问题

垃圾仍然存在!我对他们感觉很好,但是为什么end被打印两次?

我设法在每次使用终止符时都正确地使用了终止符,但是为什么在打印时会出现这种不一致的现象?我来自Java背景,已经感到很奇怪!

c arrays escaping printf
2个回答
0
投票

您的第一个字符串数组不是以null结尾的。


0
投票

之所以得到奇怪的输出,是因为您的行为不确定。处理字符串的函数(包括使用%s格式说明符和printf打印它们)期望它们以null终止,否则会出现不确定的行为。如果发生这种情况,则无法保证任何特定的输出。它可以按预期工作,可以提供奇怪的输出,可以使程序崩溃或执行其他操作。通常使用打印字符串,它将一直继续打印,直到出现访问冲突并且崩溃,或者遇到下一个空字节(这很可能早早发生,直到发生)才打印出“垃圾”。 。

© www.soinside.com 2019 - 2024. All rights reserved.