鱼C论坛

 找回密码
 立即注册
查看: 1696|回复: 14

[已解决]二维数组输出与输入

[复制链接]
发表于 2020-11-25 15:10:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为什么字符数组用一个s就可以正确输出,代码如下:

  1. #include <stdio.h>
  2. #include <windows.h>
  3. void main(){
  4. int i;
  5. char s[6][3]={"学","习","编","程","语","言"};
  6. for(i=0;i<6;i++)
  7. {
  8. printf("%s",s[i]);
  9. Sleep(1000);
  10. }
  11. }//
复制代码


而整型数组用一个s,输出却是错的呢?

  1. #include<stdio.h>
  2. void main()
  3. {
  4.         int i;
  5.         char student[5][5]={{"小明"},{"小红"},{"小李"},{"小张"},{"小肖"}};
  6.         int mark[5][5]={{85,78,93,68,76},{95,76,87,83,91},{78,69,83,79,83},{79,78,69,83,83},{91,89,78,88,85}};
  7.         for(i=0;i<=4;++i)
  8.         {
  9.                 printf("%d\n",mark[i]);
  10.         }
  11. }
复制代码
最佳答案
2020-11-26 11:55:06
18878977809 发表于 2020-11-26 11:53
这么理解对吗:
  字符串输出%s,是从首地址开始读读到反斜杠零结束。例如:i=0时,a=a[0],数组名即 ...

     基本上就是这个意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-25 15:42:06 | 显示全部楼层
求一个大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-25 16:20:52 | 显示全部楼层
       首先,字符串和整型数在计算机内存中都是数字,这一点,二者是一样的,其中,字符储存的是字符的编码数值,而整型数储存的就是整型数本身,对于 ASCII 字符而言,每个字符占用一个字节,对于整型数而言,每一个数占用 4 个字节,显示字符串的时候,计算机会把每一个字节作为字符编码显示成对应的字符,这个时候,如果显示内容是字符串,当然是可以正常输出的,但是,如果把整型数当成字符串输出,那情况就可想而知了,因为这些整型数本身不是字符编码,被当成字符编码显示出来,我们拿肉眼看的时候,就会发现是一些没有任何意义的杂乱字符,难道楼主希望看到这样的东西?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-25 19:25:44 | 显示全部楼层
jackz007 发表于 2020-11-25 16:20
首先,字符串和整型数在计算机内存中都是数字,这一点,二者是一样的,其中,字符储存的是字符的编 ...

那怎么改,才能正常输出呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-25 21:04:21 | 显示全部楼层
  1. #include <stdio.h>
  2. main(void)
  3. {
  4.         int i , j ;
  5.         char student[5][5]={{"小明"},{"小红"},{"小李"},{"小张"},{"小肖"}};
  6.         int mark[5][5]={{85,78,93,68,76},{95,76,87,83,91},{78,69,83,79,83},{79,78,69,83,83},{91,89,78,88,85}};
  7.         for(i = 0 ; i < 5 ; i ++)
  8.         {
  9.                 if(i) printf(" , ")               ;
  10.                 printf("%s" , student[i])         ;
  11.         }
  12.         printf("\n")                              ;
  13.         for(i = 0 ; i < 5 ; i ++)
  14.         {
  15.                 for(j = 0 ; j < 5 ; j ++)
  16.                 {
  17.                         if(j) printf(" , ")       ;
  18.                         printf("%d" , mark[i][j]) ;
  19.                 }
  20.                 printf("\n")                      ;
  21.         }
  22. }
复制代码

        编译、运行实况
  1. D:\00.Excise\C>g++ -o x x.c

  2. D:\00.Excise\C>x
  3. 小明 , 小红 , 小李 , 小张 , 小肖
  4. 85 , 78 , 93 , 68 , 76
  5. 95 , 76 , 87 , 83 , 91
  6. 78 , 69 , 83 , 79 , 83
  7. 79 , 78 , 69 , 83 , 83
  8. 91 , 89 , 78 , 88 , 85

  9. D:\00.Excise\C>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-25 23:05:49 From FishC Mobile | 显示全部楼层
你好,你是用for语句循环嵌套来做,列和行两个循环。而我只是一个for行(应该是)循环,为什么我就输出不了呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-25 23:06:46 From FishC Mobile | 显示全部楼层
%d,我应该是把整型数当作整行数来输出?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-25 23:07:25 From FishC Mobile | 显示全部楼层
型,行打错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-25 23:09:45 From FishC Mobile | 显示全部楼层
不是很理解“把整型数当做字符串来输出”,%d是整型没错呀?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-26 11:53:31 From FishC Mobile | 显示全部楼层
本帖最后由 18878977809 于 2020-11-26 11:54 编辑
jackz007 发表于 2020-11-25 21:04
编译、运行实况


这么理解对吗:
  字符串输出%s,是从首地址开始读读到反斜杠零结束。例如:i=0时,a=a[0],数组名即首地址,则从第一行开始,一直读到反斜杠零结束。
  然后++i,i=1,a=a[1],又从第二行开始,一直读到反斜杠零结束。然后在++i,又从第三行开始,一直读到反斜杠零结束。。。最后直至i不满足条件退出循环。
  而整型输出%d则不同,必须是二维数组a[2][3]这种。写成a[0]这种整形输出是不认得的,a[0]这种是字符串的输出。整形输出必须是写成二维数组的形式即a[2][3]的形式才行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-26 11:55:06 | 显示全部楼层    本楼为最佳答案   
18878977809 发表于 2020-11-26 11:53
这么理解对吗:
  字符串输出%s,是从首地址开始读读到反斜杠零结束。例如:i=0时,a=a[0],数组名即 ...

     基本上就是这个意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-26 16:22:15 From FishC Mobile | 显示全部楼层
jackz007 发表于 2020-11-26 11:55
基本上就是这个意思。

还有什么需要漏掉的吗的吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-26 16:24:33 From FishC Mobile | 显示全部楼层
还有什么漏掉的吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-26 16:26:44 From FishC Mobile | 显示全部楼层
jackz007 发表于 2020-11-25 21:04
编译、运行实况

%s的输出原理是从首地址开始读,一直读到反斜杠零结束。那%d的输出原理是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-26 17:42:13 | 显示全部楼层
本帖最后由 jackz007 于 2020-11-26 17:43 编辑

        提交给 "%s" 的一定是一个内存地址,由 printf() 函数负责从这个地址开始向后逐字节读取编码并按照字符进行显示,直到遇到字符串结束标志 '\0';提交给 "%d" 的不能是地址,只能是一个现成的整数,printf() 只负责把这个数的值按照十进制输出,这就是区别。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-27 21:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表