c - 保存,然后在C中打印出2d数组中的字符串

时间:2017-11-21 18:33:40

标签: c arrays 2d

我尝试从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]);
}

2 个答案:

答案 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 arraychar的数组。例如,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()等。