Дополнительная печать символов в массиве 2D-символов

#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; from amp;positions[i][j] , когда он используется в качестве соответствующего аргумента для %c .

Ответ №2:

Было несколько вещей, которые вы сделали неправильно.

  1. Вы не создали правильный 2D-массив. Вы создали 2D-массив, но отформатировали его так, чтобы он выглядел как одномерный массив (как видно из вашего кода). Это компилируется, однако вы не хотите использовать этот стиль.

  2. Вы заставили его печатать элементы, используя %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 in printf .

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'}}; .