c - 保存然后在 C 的二维数组中打印出一个字符串

c - save then print out a string in 2d array in C

我正在尝试从 C 制作一个简单的程序来存储数据然后将其保存到 2d array 二维数组中存储了 2 个数据。我认为保存代码运行良好,但是当我尝试打印出存储在二维数组中的数据时,它崩溃了。

这是我的代码:

#include <stdio.h>
int main(){
 char data[2][3];

 //input the data then save it in 2d array
 printf("enter the first word: ");
 scanf("%s", &data[0][0]);
 printf("enter the second word: ");
 scanf("%s", &data[1][0]);

 //here is the problem when iam trying to print out the stored data in 2d array
 printf("first word: %s\nsecond word: %s", data[0][0],data[1][0]);
}

您的代码有 3 个问题。

首先,导致您的代码崩溃的是您的最终 printf()。您将 char 类型的 data[0][0] 传递给 %s,后者采用空终止 string。最后还需要一个额外的新行。将其更改为:

printf("first word: %s\nsecond word: %s\n", data[0], data[1]);

其次,你的数组的第二维只有 3。这意味着你只能存储大小为 3 或更小的字符串。考虑到末尾的空终止符,它只是一个 2 字符数组。将第二个维度更改为更大的数字(即 data[2][50])。

第三,&data[0][0]是多余的。您正在取消引用一个指针,然后再次将其设为指针。只需在 scanf().

中执行 data[0]data[1]

关于你对二维字符数组的困惑

我认为您对 char arraysc-strings 是什么感到困惑。一个char array是一个char的数组。例如,"Bill" 将是一个字符数组,其中 'B' 将是索引 0,'l' 将是索引 3,空终止符 '[=25=]' 将是最后一个索引告诉机器这是字符串的结尾。

A 2d char 数组将是那些字符串的数组(例如 "Bill"),如 "Bill"、"Bob"、"Alice" 等。如果你还想保留不仅要跟踪人名,还要跟踪他们的地址、电话等,您可能需要一个 3d 数组。

3d 数组看起来像 data[2][4][50]。第一层是您要跟踪的人。第二层是特定人的属性(姓名、地址等)。第三级将是一个字符数组 (char),构成一个人的属性。

正在清除一件事...

传递字符数组的地址而不是 char 的地址。

scanf("%s", data[1]);// same as &data[1][0]

这里你会看到传递char变量的地址也是可以的,因为它和char数组的地址基本重合

错误在别处...

你还应该将 char 数组的地址传递给 printf

printf("first word: %s\nsecond word: %s\n", data[0], data[1]);

或者如前一行中所指出的那样..是的,你做对了..这也有效

printf("first word: %s\nsecond word: %s\n", &data[0][0], &data[1][0]);

如您所知,将有 2 个字符使用 scanf("%2s",data[1])

那我哪里做错了?

"%s" 需要一个 char* 而你传递给它的是 char。这就是为什么它 运行 出错的原因。是的,它认为该 char 值是一个地址并尝试访问它并调用了未定义的行为。

如果你想打印字符,那么你将使用不同的格式说明符:

printf("%c",data[1][0]);

需要指出的几点:-

  • 您只考虑了 2 个长度的字符数组或 2 个长度的字符串。

  • 再次提醒您,%c 处理 char 类型的参数,%s 处理 char* 类型的参数。 (这就是 printf 中区分的原因)。

  • scanf() 就像一个解析器。如果它无法解析某些内容,它会跳过它。有更好的方法来获取输入 fgets()