为什么在 c 中打印字符串数组不提供相同的输出?

Azi*_*med 2 c arrays string character

当最后一个字符与数组下一个元素的第一个字符匹配时,给定最后一个字符的输出重复。是什么原因,应该是什么解决方案?

左边是程序右边是输出

#include <stdio.h>

int main(void) {
  int i ;

  char fact_char[13][2] = {"I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"};

  for(i = 0; i < 13; i++){
    printf("%s\n", fact_char[i]);
  }

  return 0;
}

Run Code Online (Sandbox Code Playgroud)

输出


I
IVV
V
IXX
X
XLL
L
XCC
C
CDD
D
CMM
M

Run Code Online (Sandbox Code Playgroud)

yhy*_*nus 6

c 中的字符串以空字符结尾。为了表示“IV”,您实际上是在内存中存储了 'I'、'V' 和 '\0'。当您打印一个两个字符的字符串时, printf 将继续写入,直到它在内存中找到下一个空终止符,它恰好在下一个(单个字符)字符串中。

要解决这个问题,只需制作它

fact_char[13][ 3 ]


Bar*_*mar 5

您的数组声明不允许为 2 字母字符串的空终止符留出空间。将其更改为

char fact_char[13][3]
Run Code Online (Sandbox Code Playgroud)

使用%sformat 打印char没有空终止符的数组会导致未定义的行为。