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 arrays
和 c-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()
等
我正在尝试从 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 arrays
和 c-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()
等