#c #multidimensional-array
#c #многомерный массив
Вопрос:
Я пытаюсь распечатать каждый элемент массива 2d-символов по очереди, используя этот фрагмент кода:
#include <stdio.h>
#include <stdlib.h>
char positions[3][3] = {'A', 'B', 'C', 'D', 'E', 'F','G', 'H', 'I'};
int main(){
for(int i = 0; i < 3; i ){
for(int j = 0; j < 3; j ){
printf("%s n", amp;positions[i][j]);
}
}
return 0;
}
Но результат такой:
ABCDEFGHI
BCDEFGHI
CDEFGHI
DEFGHI
EFGHI
FGHI
GHI
HI
I
Вместо:
A
B
C
D
E
F
G
H
I
И я не могу понять, как это исправить. Я осмотрелся и не смог найти никаких ответов на эту конкретную проблему. Любой совет был бы замечательным. Спасибо.
Комментарии:
1. В качестве альтернативы ответам правильный способ распечатать один символ —
printf("%.1sn", amp;positions[i][j]);
Ответ №1:
Ваш printf принимает значение %s, что вынуждает преобразовать массив символов в строку, начиная с первой записи. Попробуйте запустить
printf("%c n", positions[i][j]);
для печати символов. И посмотрим, что получится 😉
приветствую
Комментарии:
1. VS code говорит, что %c ожидает аргумент типа int и говорит мне изменить его на %s, в противном случае он просто выводит пустые строки
2. @SOLSD Вы должны удалить
amp;
fromamp;positions[i][j]
, когда он используется в качестве соответствующего аргумента для%c
.
Ответ №2:
Было несколько вещей, которые вы сделали неправильно.
-
Вы не создали правильный 2D-массив. Вы создали 2D-массив, но отформатировали его так, чтобы он выглядел как одномерный массив (как видно из вашего кода). Это компилируется, однако вы не хотите использовать этот стиль.
-
Вы заставили его печатать элементы, используя
%s
который предназначен для строк, а не символов, которые вы бы использовали%c
для этого.
Однако все остальное проверяется! Приведенный ниже код показывает, как вы могли бы правильно объявить 2D-массив:
#include <stdio.h>
int main() {
// The last square bracket shows how many elements each
// Array can hold
char positions[3][3] = {
{'A', 'B', 'C'},
{'D', 'E', 'F'},
{'G', 'H', 'I'}
};
for(int i = 0; i < 3; i )
for(int j = 0; j < 3; j )
printf("%cn", positions[i][j]);
}
Комментарии:
1. programiz.com/c-programming/c-multi-dimensional-arrays
2. Я насчитал два набора скобок, так что 2d.
3. @stark Да, это так не сработало бы, первый набор скобок указывает, сколько «строк» вы хотели бы иметь, в то время как второй набор определяет, сколько элементов будет содержать каждая строка.
4. OP определил и инициализировал допустимый 2D-массив (конечно,
char positions[3][3]
это не определение 3D-массива). Единственной проблемой с исходным кодом было неправильное использование%s
inprintf
.5. Опять же, в инициализации нет ничего плохого
char positions[3][3] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'};
. Это может считаться плохим стилем, но не неправильным с точки зрения языка C. Инициализация эквивалентнаchar positions[3][3] = {{'A', 'B', 'C'}, {'D', 'E', 'F'}, {'G', 'H', 'I'}};
.