Если вы хотите просто узнать о:
"Мне трудно понять процесс заполнения многомерного массива."
затем забудьте строку и символ и сделайте что-нибудь простое, например, используйте 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;
}