Почему печать массива строк в c не обеспечивает такой же вывод? - PullRequest
2 голосов
/ 21 февраля 2020

Когда последний символ соответствует первому символу следующего элемента массива, повторяется вывод данного последнего символа. В чем причина и какое должно быть решение?

Left side is program right side is output

#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;
}

ВЫХОД


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

Ответы [ 3 ]

6 голосов
/ 21 февраля 2020

Строки в c заканчиваются нулем. Чтобы представлять «IV», вы фактически храните «I», «V» и «\ 0» в памяти. Когда вы печатаете двухсимвольную строку, printf будет продолжать писать до тех пор, пока не найдет в памяти следующий нулевой терминатор, который находится в следующей (односимвольной) строке.

Чтобы это исправить, просто сделать это

fact_char [13] [ 3 ]

5 голосов
/ 21 февраля 2020

Ваши объявления массива не оставляют места для нулевых терминаторов двухбуквенных строк. Измените его на

char fact_char[13][3]

Использование формата %s для печати массива char, который не имеет нулевого терминатора, приводит к неопределенному поведению.

1 голос
/ 22 февраля 2020

printf("%s\n", fact_char[i]); ожидает, что fact_char[i] будет строкой .

A строкой является непрерывной последовательностью символов, оканчивающихся на и включающих первый нулевой символ C18

fact_char[11] не является строкой , поскольку в нем отсутствует нулевой символ . Это только 'C', 'M'.

. Оставьте больше места с помощью fact_char[13][3] или напечатайте с ограничением ширины. Следующая команда прекратит печать после 2 символов или до тех пор, пока не будет обнаружен нулевой символ . fact_char[11] по-прежнему не будет строкой , так как в ней отсутствует нулевой символ .

printf("%.2s\n", fact_c[i]); // limit print width
...