我尝试从C
创建一个简单的程序来存储数据,然后将其保存到存储在2d数组中的2d array
数据中。我认为保存代码运行良好,但是当我尝试打印出存储在2d数组中的数据时,它会崩溃。
这是我的代码:
#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]);
}
答案 0 :(得分:2)
您的代码有3个问题。
首先,导致代码崩溃的是最终的printf()
。您将类型为char
的数据[0] [0]传递给%s
,它将空终止string
。最后还需要一个额外的新行。将其更改为:
printf("first word: %s\nsecond word: %s\n", data[0], data[1]);
其次,您的数组的第二个维度仅为3.这意味着您只能存储大小为3或更小的字符串。在最后考虑空终止符,它只是一个2字符数组。将第二个维度更改为更大的数字(即数据[2] [50])。
第三,&data[0][0]
是多余的。您正在取消引用指针,然后再将其作为指针。只需在data[0]
中执行data[1]
和scanf()
。
关于你对2d char数组的困惑
我认为您对char arrays
是什么以及c-strings
是什么感到困惑。 char array
是char
的数组。例如,Bill&#34;将是一个char数组,其中'B'
将是索引0,'l'
将是索引3,而null ternimator '\0'
将是告诉机器这是字符串结尾的最后一个索引。
2d char数组将是这些字符串的数组(例如&#34; Bill&#34;),如&#34; Bill&#34;,&#34; Bob&#34;,&#34; Alice&# 34;如果您不仅要跟踪人们的姓名,还要跟踪他们的地址,电话等,您可能需要一个3d数组。
3d数组看起来像data[2][4][50]
。第一级是您想要跟踪的人。第二级是特定人员的属性(姓名,地址等)。第三级将是一个字符数组(char
),它构成了一个人的属性。
答案 1 :(得分:1)
传递字符数组的地址而不是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()
等。