如果您只想了解:
“我很难理解填充多维数组的过程。”
然后忘记字符串和字符,做一些简单的事情,比如使用 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
你按回车的那个。你可以在这里阅读,但这就是为什么你最初必须输入两次 somet input 并按 Enter 的原因。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
填充字符串
如果你想读取字符串,那么你需要做一些不同的事情。您不需要二维数组。您需要一个 3 维数组,因为字符串本身就是字符数组。如果没有 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 种变体,它使用char* arr[2][2]
3D-char 数组代替。它没有太大变化,但就像我说的,只是为了更好的衡量。
#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;
}