0

我在做我的一项任务时遇到了这部分的问题。所以我决定做一个简单的程序来存储,看看我的理解是否正确,但我仍然遇到同样的问题。

最初,我没有创建数组指针,但这会导致程序立即崩溃。所以这也是为什么它们是 char 指针。如果有人还可以解释为什么他们需要成为指针以及为什么它会以这种方式打印,那将非常有帮助。

#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

不是正确的输出

4

1 回答 1

1

如果您只想了解:

“我很难理解填充多维数组的过程。”

然后忘记字符串和字符,做一些简单的事情,比如使用 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;
}
于 2019-02-02T19:34:49.923 回答