【问题标题】:c - save then print out a string in 2d array in Cc - 保存然后打印出 C 中二维数组中的字符串
【发布时间】:2017-11-21 18:33:40
【问题描述】:

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

【问题讨论】:

  • 你使用了什么输入法?
  • 我的意思是有类似的数据库,所以会有账单、姓名、地址、电话存储在二维数组中,我想将字符串存储在二维数组中,然后我会打印出来

标签: c arrays 2d


【解决方案1】:

您的代码有 3 个问题。

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

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

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

第三,&amp;data[0][0] 是多余的。您正在取消引用指针,然后再次使其成为指针。只需在您的scanf() 中输入data[0]data[1]


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

我认为您对 char arrays 是什么以及 c-strings 是什么感到困惑。 char arraychar 的数组。例如,“Bill”将是一个 char 数组,其中 'B' 将是索引 0,'l' 将是索引 3,并且空终止符 '\0' 将是告诉机器这是最后一个索引字符串的结尾。

2d 字符数组将是这些字符串(例如“Bill”)的数组,例如“Bill”、“Bob”、“Alice”等。如果您不仅要跟踪人名,还要跟踪他们的姓名地址、电话等,您可能需要一个 3d 数组。

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

【讨论】:

  • Nvm。我的错。移除了 DV,添加了 UV。
  • 如果我想使用二维数组存储客户数据,例如:账单名称电子邮件电话 112 James test@mail.com 6513140090 113 Jason test1@mail.com 6513140020
  • 您是否有理由必须使用二维数组?对于一个人来说,这是很多领域。如果未强制执行二维数组,我建议您考虑为一个人创建一个struct,然后拥有一个结构数组或指向结构的指针。
  • 老实说,这是我的大学作业,应用要求是“可以存储客户数据,如姓名、账单、email.phone”,在我做这个作业之前,我上了一堂关于二维数组的课
  • 我做了一个这样的例子:
    #include int main(){ int rek=0,nama=1,email=2,telp=3; char *data[4][30]={ //norek {"111","112","113"}, //nama {"Ramoens Ceri","Cepa Cepo","Karren Hock"}, //电子邮件 {"t@t.co","r@r.com","f@f.com"}, //telp {"0812","0813","0814"} }; for(int x=0;x
【解决方案2】:

清除一件事...

传递字符数组的地址而不是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() 等。

【讨论】:

  • 如果我想打印出 data[0][1] 或 data[1][1] 怎么办?我真的被困在这里了
猜你喜欢
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 2015-12-13
  • 2017-12-29
  • 2011-06-22
  • 2015-12-21
相关资源
最近更新 更多