18878977809 发表于 2020-11-25 15:10:31

二维数组输出与输入

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

#include <stdio.h>
#include <windows.h>
void main(){
int i;
char s={"学","习","编","程","语","言"};
for(i=0;i<6;i++)
{
printf("%s",s);
Sleep(1000);
}
}//

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

#include<stdio.h>
void main()
{
        int i;
        char student={{"小明"},{"小红"},{"小李"},{"小张"},{"小肖"}};
        int mark={{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}};
        for(i=0;i<=4;++i)
        {
                printf("%d\n",mark);
        }
}

心驰神往 发表于 2020-11-25 15:42:06

求一个大佬

jackz007 发表于 2020-11-25 16:20:52

       首先,字符串和整型数在计算机内存中都是数字,这一点,二者是一样的,其中,字符储存的是字符的编码数值,而整型数储存的就是整型数本身,对于 ASCII 字符而言,每个字符占用一个字节,对于整型数而言,每一个数占用 4 个字节,显示字符串的时候,计算机会把每一个字节作为字符编码显示成对应的字符,这个时候,如果显示内容是字符串,当然是可以正常输出的,但是,如果把整型数当成字符串输出,那情况就可想而知了,因为这些整型数本身不是字符编码,被当成字符编码显示出来,我们拿肉眼看的时候,就会发现是一些没有任何意义的杂乱字符,难道楼主希望看到这样的东西?

18878977809 发表于 2020-11-25 19:25:44

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

那怎么改,才能正常输出呢?

jackz007 发表于 2020-11-25 21:04:21

#include <stdio.h>
main(void)
{
      int i , j ;
      char student={{"小明"},{"小红"},{"小李"},{"小张"},{"小肖"}};
      int mark={{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}};
      for(i = 0 ; i < 5 ; i ++)
      {
                if(i) printf(" , ")               ;
                printf("%s" , student)         ;
      }
      printf("\n")                              ;
      for(i = 0 ; i < 5 ; i ++)
      {
                for(j = 0 ; j < 5 ; j ++)
                {
                        if(j) printf(" , ")       ;
                        printf("%d" , mark) ;
                }
                printf("\n")                      ;
      }
}
      编译、运行实况
D:\00.Excise\C>g++ -o x x.c

D:\00.Excise\C>x
小明 , 小红 , 小李 , 小张 , 小肖
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

D:\00.Excise\C>

18878977809 发表于 2020-11-25 23:05:49

你好,你是用for语句循环嵌套来做,列和行两个循环。而我只是一个for行(应该是)循环,为什么我就输出不了呢

18878977809 发表于 2020-11-25 23:06:46

%d,我应该是把整型数当作整行数来输出?

18878977809 发表于 2020-11-25 23:07:25

型,行打错了

18878977809 发表于 2020-11-25 23:09:45

不是很理解“把整型数当做字符串来输出”,%d是整型没错呀?

18878977809 发表于 2020-11-26 11:53:31

本帖最后由 18878977809 于 2020-11-26 11:54 编辑

jackz007 发表于 2020-11-25 21:04
编译、运行实况

这么理解对吗:
字符串输出%s,是从首地址开始读读到反斜杠零结束。例如:i=0时,a=a,数组名即首地址,则从第一行开始,一直读到反斜杠零结束。
然后++i,i=1,a=a,又从第二行开始,一直读到反斜杠零结束。然后在++i,又从第三行开始,一直读到反斜杠零结束。。。最后直至i不满足条件退出循环。
而整型输出%d则不同,必须是二维数组a这种。写成a这种整形输出是不认得的,a这种是字符串的输出。整形输出必须是写成二维数组的形式即a的形式才行

jackz007 发表于 2020-11-26 11:55:06

18878977809 发表于 2020-11-26 11:53
这么理解对吗:
字符串输出%s,是从首地址开始读读到反斜杠零结束。例如:i=0时,a=a,数组名即 ...

   基本上就是这个意思。

18878977809 发表于 2020-11-26 16:22:15

jackz007 发表于 2020-11-26 11:55
基本上就是这个意思。

还有什么需要漏掉的吗的吗

18878977809 发表于 2020-11-26 16:24:33

还有什么漏掉的吗

18878977809 发表于 2020-11-26 16:26:44

jackz007 发表于 2020-11-25 21:04
编译、运行实况

%s的输出原理是从首地址开始读,一直读到反斜杠零结束。那%d的输出原理是什么?

jackz007 发表于 2020-11-26 17:42:13

本帖最后由 jackz007 于 2020-11-26 17:43 编辑

      提交给 "%s" 的一定是一个内存地址,由 printf() 函数负责从这个地址开始向后逐字节读取编码并按照字符进行显示,直到遇到字符串结束标志 '\0';提交给 "%d" 的不能是地址,只能是一个现成的整数,printf() 只负责把这个数的值按照十进制输出,这就是区别。
页: [1]
查看完整版本: 二维数组输出与输入