Если вы хотите просто узнать о:
Мне сложно понять процесс заполнения многомерного массива.
затем забудьте строку и char и сделайте что-нибудь простое, например, используйте 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
И на всякий случай вот 4-й вариант, в котором вместо массива 3D-символов используется char* arr[2][2]
. Это не сильно меняет, но, как я уже сказал, просто на всякий случай.
#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;
}
person
Duck Dodgers
schedule
02.02.2019
scanf("%s\n", str[0]);
— это ошибка, вы передаете (неинициализированное) значениеchar
функции, которая ожидает типchar *
, указатель наchar
. Это должно бытьscanf("%19s", str);
, где19
предотвращает переполнение буфера, и я удалил новую строку. - person Weather Vane   schedule 02.02.2019%s
вprintf("arr[%d][%d] == %s\n",i,j,arr[i][j]);
, который должен быть%c
. - person Weather Vane   schedule 02.02.2019char *str[20]
— массив из 20 указателей на символы, которые никуда не указывают. Вам нужно, чтобы они указывали на место с достаточным объемом памяти, или, может быть, вы имели в видуchar str[20];
— в этом случае вам нужно настроить вызов наscanf()
— вам нужно убрать суффикс[0]
. Что бы ни случилось, вам также нужно убедиться, что вы читаете в отдельную память для каждой строки или копируете то, что было прочитано вstr
, во вновь выделенное пространство. - person Jonathan Leffler   schedule 02.02.2019char str[20];
наchar *str[20]
, которое представило ваш комментарий. Изменение вопроса затрудняет отслеживание комментариев, если только сообщение не было опубликовано правильно. Извините, я откатывал его до того, как появился ваш комментарий. - person Weather Vane   schedule 02.02.2019