Мне трудно понять процесс заполнения многомерного массива.Почему мой код печатает одну букву несколько раз? - PullRequest
0 голосов
/ 02 февраля 2019

У меня была проблема с этой частью во время выполнения одного из моих заданий.Поэтому я решил создать простую программу для хранения и проверить правильность моего понимания, но у меня все еще остаются те же проблемы.

Изначально я не делал указатели на массивы, но это сразу вызывало сбой программы.Вот почему они также являются указателями на символы.Если кто-то также может объяснить, почему он должен быть указателем и почему он печатает так, как он делает, это было бы очень полезно.

#include <stdio.h>

int main() {
  char arr[2][2];
  char str[20];
  for(int i = 0; i < 2; i++){
    for (int j = 0; j < 2; j++){
      printf("%s\n", "please put in a string: ");
      scanf("%s\n", str[0]);
      arr[i][j] = str[0];
    }
  }
  for(int i = 0; i < 2; i++){
    for (int j = 0; j < 2; j++){
      printf("arr[%d][%d] == %s\n", i,j,arr[i][j]);
    }
  }
  return 0;
}

вывод, который я получил:

please put in a string:
pleasework
what
please put in a string:
s
please put in a string:
f
please put in a string:
g
arr[0][0] == f
arr[0][1] == f
arr[1][0] == f
arr[1][1] == f

Не правильные выводы

1 Ответ

0 голосов
/ 02 февраля 2019

Если вы хотите просто узнать о:

"Мне трудно понять процесс заполнения многомерного массива."

затем забудьте строку и символ и сделайте что-нибудь простое, например, используйте int.Следующий пример кода показывает именно это.

Простейший случай: заполнить многомерный массив любого типа

#include <stdio.h>

int main() {
  int arr[2][2];
  int str;
  for(int i = 0; i < 2; i++){
    for (int j = 0; j < 2; j++){
      printf("please put in a number [%d][%d]: ", i,j);
      scanf("%d", &str);
      arr[i][j] = str;
    }
  }
  for(int i = 0; i < 2; i++){
    for (int j = 0; j < 2; j++){
      printf("arr[%d][%d] == %d\n", i,j,arr[i][j]);
    }
  }
  return 0;
}
$ ./stackoverflow
please put in an number[0][0]: 1
please put in an number[0][1]: 2
please put in an number[1][0]: 34
please put in an number[1][1]: 450

arr[0][0] == 1
arr[0][1] == 2
arr[1][0] == 34
arr[1][1] == 450

Заполнить символы

Если вы хотите использовать одиночные символы, то вы также можете использовать следующий код, НО вы должны позаботиться.scanf работает таинственными способами.Обратите внимание, как место там до %c.То есть потреблять \n, который вы там нажимаете ввод.Вы можете прочитать здесь , но это было причиной того, почему вы должны были сначала дважды ввести какой-нибудь ввод и нажать клавишу ввода.Честно говоря, я бы использовал что-то еще, кроме scanf, например fgets, но, поскольку вы использовали scanf, я показал код, который также использует его.

#include <stdio.h>

int main() {
  char arr[2][2];
  char str;
  for(int i = 0; i < 2; i++){
    for (int j = 0; j < 2; j++){
      printf("%s", "please put in a character: ");
      if (scanf(" %c", &str) == 1)  { arr[i][j] = str; }
    }
  }
  for(int i = 0; i < 2; i++){
    for (int j = 0; j < 2; j++){
      printf("arr[%d][%d] == %c\n", i,j,arr[i][j]);
    }
  }
  return 0;
}
$ ./stackoverflow
please put in a character: a
please put in a character: b
please put in a character: c
please put in a character: d

arr[0][0] == a
arr[0][1] == b
arr[1][0] == c
arr[1][1] == d

Заполнение строк

Если вы хотите читать строки, то вам нужно сделать это немного по-другому.Вам не нужен двухмерный массив.Вам нужен трехмерный массив, потому что строки сами по себе являются массивами символов.Без 3D-массива вы перезаписали 2D-массив и получили только последнее значение, напечатанное несколько раз.Что было хуже, так как ваш многомерный массив имеет размер 2x2, а входная строка - 1xn, а если n больше 2, вы получите переполнение буфера.Следующий код исправляет их.

#include <stdio.h>
#include <string.h>

int main() {
  char arr[2][2][20];
  char str[20];
  for(int i = 0; i < 2; i++){
    for (int j = 0; j < 2; j++){
      printf("%s", "please put in a string: ");
      if (scanf("%s", &str[0]) == 1)
      {
          // arr[i][j] = &str[0];
          strncpy(arr[i][j], str, 20);
      }
    }
  }
  for(int i = 0; i < 2; i++){
    for (int j = 0; j < 2; j++){
      printf("arr[%d][%d] == %s\n", i,j, arr[i][j]);
    }
  }
  return 0;
}
$ ./stackoverflow
please put in a string: ab
please put in a string: cd
please put in a string: ef
please put in a string: gh

arr[0][0] == ab
arr[0][1] == cd
arr[1][0] == ef
arr[1][1] == gh

И просто для примера, вот четвертый вариант, который использует char* arr[2][2] вместо массива 3D-символов.Это мало что меняет, но, как я уже сказал, просто для хорошей меры.

#include <stdio.h>
#include <string.h>
#include <malloc.h>

int main() {
    char* arr[2][2];
    char str[20];
    for(int i = 0; i < 2; i++){
        for (int j = 0; j < 2; j++){
            printf("%s", "please put in a string: ");
            if (scanf("%s", &str[0]) == 1)
            {
                arr[i][j] = (char*)malloc(20*sizeof(char));
                strncpy(arr[i][j], str, 20);
            }
        }
    }

    for(int i = 0; i < 2; i++){
        for (int j = 0; j < 2; j++){
            printf("arr[%d][%d] == %s\n", i,j, arr[i][j]);
        }
    }
  return 0;
}
...