У вас есть дополнительные символы, потому что когда вы обрабатываете строки символов как C строки, они должны заканчиваться нулем. Ваши массивы - это VLA, массивы переменной длины, которые нельзя инициализировать, когда они определены.
Есть несколько способов решить эту проблему.
(1) Не обрабатывать массив char как C строка и распечатать матрицу с двумя вложенными циклами. Скучно, но выполняет свою работу.
(2) Обнулить ваши массивы. Для этого вы должны выделить дополнительное место для каждой строки, куда вы положили '\0'
. (Давайте также избавимся от 10 здесь. Вы знаете, насколько большими должны быть массивы, поэтому распределите их соответствующим образом.)
char horizontal[m][n + 1], vertical[n][m + 1];
Затем установите для последнего символа в каждой строке нулевой символ:
for (int i = 0; i < m; i++) horizontal[i][n] = '\0';
for (int i = 0; i < n; i++) vertical[i][m] = '\0';
(Weather Vane предложила инициализировать все массивы нулями, но, к сожалению, это работает только для массивов, размер которых известен во время компиляции. Однако ваши массивы имеют переменную длину. Вы можете использовать memset
из <string.h>
для обнуления массивов, если вы чувствуете себя комфортно с необработанными данными, и sizeof
.)
(3) Используйте возможности строк формата printf
: вы можете придать точности строку. Это число, которое означает «печатать как можно больше символов». Указав звездочку, вы можете прочитать это число из списка аргументов. Итак:
for (int i = 0; i < m; i++) {
printf("%.*s\n", n, horizontal[i]);
// ^^ ^ precision
}
for (int i = 0; i < n; i++) {
printf("%.*s\n", m, vertical[i]);
// ^^ ^ precision
}