说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

字符数组-C语言教程

HTML文档下载 WORD文档下载 PDF文档下载
在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。用来存放字符量的数组称为字符数组。
7.3 字符数组
用来存放字符量的数组称为字符数组。
7.3.1 字符数组的定义
形式与前面介绍的数值数组相同。
例如:
    char c[10];
由于字符型和整型通用,也可以定义为int c[10]但这时每个数组元素占2个字节的内存单元。
字符数组也可以是二维或多维数组。
例如:
    char c[5][10];
即为二维字符数组。
7.3.2 字符数组的初始化
字符数组也允许在定义时作初始化赋值。
例如:
    char c[10]={‘c’, ‘  ’, ‘p’, ‘r’, ‘o’, ‘g’, ‘r’, ‘a’,’m’};
赋值后各元素的值为:
    数组C    c[0]的值为‘c’
c[1]的值为‘ ’
c[2]的值为‘p’ 
c[3]的值为‘r’
c[4]的值为‘0’
c[5]的值为‘g’
c[6]的值为‘r’
c[7]的值为‘a’
c[8]的值为‘m’
其中c[9]未赋值,由的值为‘p’系统自动赋予0值。
当对全体元素赋初值时也可以省去长度说明。
例如:
    char c[]={`c`,` `,`p`,`r`,`o`,`g`,`r`,`a`,`m`};
这时C数组的长度自动定为9。
7.3.3 字符数组的引用
【例7.8】
main(){  int i,j;  char a[][5]={{'B','A','S','I','C',},{'d','B','A','S','E'}};  for(i=0;i<=1;i++)    {      for(j=0;j<=4;j++)          printf("%c",a[i][j]);      printf("\n");    }}
本例的二维字符数组由于在初始化时全部元素都赋以初值,因此一维下标的长度可以不加以说明。
7.3.4 字符串和字符串结束标志
在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。前面介绍字符串常量时,已说明字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。
C语言允许用字符串的方式对数组作初始化赋值。
例如:
    char c[]={'c', ' ','p','r','o','g','r','a','m'};
可写为:
        char c[]={"C program"};
    或去掉{}写为:
        char c[]="C program";
用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'\0'。上面的数组c在内存中的实际存放情况为:

C

 

p

r

o

g

r

a

m

\0

    ‘\0'是由C编译系统自动加上的。由于采用了‘\0'标志,所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理。
7.3.5 字符数组的输入输出
在采用字符串方式后,字符数组的输入输出将变得简单方便。
除了上述用字符串赋初值的办法外,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串,而不必使用循环语句逐个地输入输出每个字符。
【例7.9】
main(){  char c[]="BASIC\ndBASE";  printf("%s\n",c);}
注意在本例的printf函数中,使用的格式字符串为“%s”,表示输出的是一个字符串。而在输出表列中给出数组名则可。不能写为:
printf("%s",c[]);
【例7.10】
main(){  char st[15];  printf("input string:\n");  scanf("%s",st);  printf("%s\n",st);}
本例中由于定义数组长度为15,因此输入的字符串长度必须小于15,以留出一个字节用于存放字符串结束标志`\0`。应该说明的是,对一个字符数组,如果不作初始化赋值,则必须说明数组长度。还应该特别注意的是,当用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。
例如当输入的字符串中含有空格时,运行情况为:
    input string:
        this is a book
输出为:
this
从输出结果可以看出空格以后的字符都未能输出。为了避免这种情况,可多设几个字符数组分段存放含空格的串。
程序可改写如下:
【例7.11】
main(){  char st1[6],st2[6],st3[6],st4[6];  printf("input string:\n");  scanf("%s%s%s%s",st1,st2,st3,st4);  printf("%s %s %s %s\n",st1,st2,st3,st4);}
    本程序分别设了四个数组, 输入的一行字符的空格分段分别装入四个数组。然后分别输出这四个数组中的字符串。
在前面介绍过,scanf的各输入项必须以地址方式出现,如 &a,&b等。但在前例中却是以数组名方式出现的,这是为什么呢?
这是由于在C语言中规定,数组名就代表了该数组的首地址。整个数组是以首地址开头的一块连续的内存单元。
如有字符数组char c[10],在内存可表示如图。

C[0]

C[1]

C[2]

C[3]

C[4]

C[5]

C[6]

C[7]

C[8]

C[9]

设数组c的首地址为2000,也就是说c[0]单元地址为2000。则数组名c就代表这个首地址。因此在c前面不能再加地址运算符&。如写作scanf("%s",&c);则是错误的。 在执行函数printf("%s",c) 时,按数组名c找到首地址,然后逐个输出数组中各个字符直到遇到字符串终止标志'\0'为止。
7.3.6 字符串处理函数
C语言提供了丰富的字符串处理函数, 大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。 使用这些函数可大大减轻编程的负担。用于输入输出的字符串函数,在使用前应包含头文件"stdio.h",使用其它字符串函数则应包含头文件"string.h"。
下面介绍几个最常用的字符串函数。
1. 字符串输出函数 puts
   格式:  puts (字符数组名)
   功能:把字符数组中的字符串输出到显示器。 即在屏幕上显示该字符串。
【例7.12】
#include"stdio.h"main(){  char c[]="BASIC\ndBASE";  puts(c);}
    从程序中可以看出puts函数中可以使用转义字符,因此输出结果成为两行。puts函数完全可以由printf函数取代。当需要按一定格式输出时,通常使用printf函数。
2. 字符串输入函数gets
   格式:  gets  (字符数组名)
   功能:从标准输入设备键盘上输入一个字符串。
 本函数得到一个函数值,即为该字符数组的首地址。
【例7.13】
#include"stdio.h"main(){  char st[15];  printf("input string:\n");  gets(st);  puts(st);}
    可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。
3. 字符串连接函数strcat
   格式:  strcat (字符数组名1,字符数组名2)
   功能:把字符数组2中的字符串连接到字符数组1 中字符串的后面,并删去字符串1后的串标志“\0”。本函数返回值是字符数组1的首地址。
【例7.14】
#include"string.h"main(){  static char st1[30]="My name is ";  int st2[10];  printf("input your name:\n");  gets(st2);  strcat(st1,st2);  puts(st1);}
    本程序把初始化赋值的字符数组与动态赋值的字符串连接起来。要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。
4. 字符串拷贝函数strcpy
   格式:  strcpy (字符数组名1,字符数组名2)
   功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“\0”也一同拷贝。字符数名2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。
【例7.15】
#include"string.h"main(){  char st1[15],st2[]="C Language";  strcpy(st1,st2);  puts(st1);printf("\n");}
本函数要求字符数组1应有足够的长度,否则不能全部装入所拷
贝的字符串。
5. 字符串比较函数strcmp
   格式:  strcmp(字符数组名1,字符数组名2)
   功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。
          字符串1=字符串2,返回值=0;
  字符串2〉字符串2,返回值〉0;
  字符串1〈字符串2,返回值〈0。
本函数也可用于比较两个字符串常量,或比较数组和字符串常量。
【例7.16】
#include"string.h"main(){ int k;  static char st1[15],st2[]="C Language";  printf("input a string:\n");  gets(st1);  k=strcmp(st1,st2);  if(k==0) printf("st1=st2\n");  if(k>0) printf("st1>st2\n");  if(k<0) printf("st1<st2\n");}
本程序中把输入的字符串和数组st2中的串比较,比较结果返回到k中,根据k值再输出结果提示串。当输入为dbase时,由ASCII 码可知“dBASE”大于“C Language”故k〉0,输出结果“st1>st2”。
6. 测字符串长度函数strlen
   格式:  strlen(字符数组名)
   功能:测字符串的实际长度(不含字符串结束标志‘\0’) 并作为函数返回值。
【例7.17】
#include"string.h"main(){ int k;  static char st[]="C language";  k=strlen(st);  printf("The lenth of the string is %d\n",k);}
7.4 程序举例
【例7.18】把一个整数按大小顺序插入已排好序的数组中。
为了把一个数按大小插入已排好序的数组中,应首先确定排序是从大到小还是从小到大进行的。设排序是从大到小进序的,则可把欲插入的数与数组中各数逐个比较,当找到第一个比插入数小的元素i时,该元素之前即为插入位置。然后从数组最后一个元素开始到该元素为止,逐个后移一个单元。最后把插入数赋予元素i即可。如果被插入数比所有的元素值都小则插入最后位置。
main(){  int i,j,p,q,s,n,a[11]={127,3,6,28,54,68,87,105,162,18};  for(i=0;i<10;i++)      { p=i;q=a[i];	for(j=i+1;j<10;j++)	if(q<a[j]) {p=j;q=a[j];}	if(p!=i)	{	  s=a[i];	  a[i]=a[p];	  a[p]=s;	}	printf("%d ",a[i]);      }    printf("\ninput number:\n");    scanf("%d",&n);    for(i=0;i<10;i++)      if(n>a[i])      {for(s=9;s>=i;s--) a[s+1]=a[s];      break;}      a[i]=n;    for(i=0;i<=10;i++)      printf("%d ",a[i]);    printf("\n");}
本程序首先对数组a中的10个数从大到小排序并输出排序结果。然后输入要插入的整数n。再用一个for语句把n和数组元素逐个比较,如果发现有n>a[i]时,则由一个内循环把i以下各元素值顺次后移一个单元。后移应从后向前进行(从a[9]开始到a[i]为止)。 后移结束跳出外循环。插入点为i,把n赋予a[i]即可。 如所有的元素均大于被插入数,则并未进行过后移工作。此时i=10,结果是把n赋于a[10]。最后一个循环输出插入数后的数组各元素值。
    程序运行时,输入数47。从结果中可以看出47已插入到54和 28之间。
【例7.19】在二维数组a中选出各行最大的元素组成一个一维数组b。
a=( 3  16 87  65
  4  32 11 108 
10 25 12  37)
b=(87 108 37)
本题的编程思路是,在数组A的每一行中寻找最大的元素,找到之后把该值赋予数组B相应的元素即可。程序如下:
main(){    int a[][4]={3,16,87,65,4,32,11,108,10,25,12,27};    int b[3],i,j,l;    for(i=0;i<=2;i++)      { l=a[i][0];	for(j=1;j<=3;j++)	if(a[i][j]>l) l=a[i][j];	b[i]=l;}    printf("\narray a:\n");    for(i=0;i<=2;i++)      { for(j=0;j<=3;j++)	printf("%5d",a[i][j]);	printf("\n");}      printf("\narray b:\n");    for(i=0;i<=2;i++)      printf("%5d",b[i]);    printf("\n");}
程序中第一个for语句中又嵌套了一个for语句组成了双重循环。外循环控制逐行处理,并把每行的第0列元素赋予l。进入内循环后,把l与后面各列元素比较,并把比l大者赋予l。内循环结束时l 即为该行最大的元素,然后把l值赋予b[i]。等外循环全部完成时,数组b中已装入了a各行中的最大值。后面的两个 for语句分别输出数组a和数组b。
【例7.20】输入五个国家的名称按字母顺序排列输出。
    本题编程思路如下:五个国家名应由一个二维字符数组来处理。然而C语言规定可以把一个二维数组当成多个一维数组处理。 因此本题又可以按五个一维数组处理, 而每一个一维数组就是一个国家名字符串。用字符串比较函数比较各一维数组的大小,并排序,输出结果即可。
编程如下:
main(){    char st[20],cs[5][20];    int i,j,p;    printf("input country's name:\n");    for(i=0;i<5;i++)      gets(cs[i]);    printf("\n");    for(i=0;i<5;i++)      { p=i;strcpy(st,cs[i]);	for(j=i+1;j<5;j++)      if(strcmp(cs[j],st)<0) {p=j;strcpy(st,cs[j]);}    if(p!=i)      {	strcpy(st,cs[i]);	strcpy(cs[i],cs[p]);	strcpy(cs[p],st);      }    puts(cs[i]);}printf("\n");}
本程序的第一个for语句中,用gets函数输入五个国家名字符串。上面说过C语言允许把一个二维数组按多个一维数组处理,本程序说明cs[5][20]为二维字符数组,可分为五个一维数组cs[0],cs[1],cs[2],cs[3],cs[4]。因此在gets函数中使用cs[i]是合法的。 在第二个for语句中又嵌套了一个for语句组成双重循环。这个双重循环完成按字母顺序排序的工作。在外层循环中把字符数组cs[i]中的国名字符串拷贝到数组st中,并把下标i赋予P。进入内层循环后,把st与cs[i]以后的各字符串作比较,若有比st小者则把该字符串拷贝到st中,并把其下标赋予p。内循环完成后如p不等于i说明有比cs[i]更小的字符串出现,因此交换cs[i]和st的内容。至此已确定了数组cs的第i号元素的排序值。然后输出该字符串。在外循环全部完成之后即完成全部排序和输出。
7.5 本章小结
1.数组是程序设计中最常用的数据结构。数组可分为数值数组(整数组,实数组),字符数组以及后面将要介绍的指针数组,结构数组等。
2.数组可以是一维的,二维的或多维的。
3.数组类型说明由类型说明符、数组名、数组长度(数组元素个数)三部分组成。数组元素又称为下标变量。 数组的类型是指下标变量取值的类型。
4.对数组的赋值可以用数组初始化赋值,输入函数动态赋值和赋值语句赋值三种方法实现。 对数值数组不能用赋值语句整体赋值、输入或输出,而必须用循环语句逐个对数组元素进行操作。
2014全球云计算大会中国站(CC China)精彩集锦 腾讯X5浏览服务正式开放 30多款APP成为首批受益者 Node.js设计经验谈 LeanKanban University首位中国认证讲师路宁:看板会为更多国内企业带来深刻变革 环信IM沙龙纪实:无分享不IM,无社交不未来 【工具推荐】ESL:更简洁、更高效的标准加载器 【先锋】亲加通讯云:以云服务模式为App提供社交引擎 2014中国移动开发者大调查第一批获奖名单大曝光 移动开发云服务AVOS Cloud宣布完成A轮融资 Uplinq2014:人工智能嵌入硬件 万物互联建生态 Uplinq2014:基于Vuforia的新奇智能玩具 一应俱全!开源跨平台3D应用开发框架Minko 【线下技术培训】敏捷测试实战解析和系统方案 《近匠》Ping++:简单、高效、第三方支付SDK 有关编程的12个猜想 【问底】王帅:深入PHP内核(二)——SAPI探究 【CTO俱乐部走进汽车之家】活动图文实录 只为逼格?超薄便携式无线充电设备Deuce 戴尔未来重心:云计算、大数据、移动互联与安全 【讲师】搜狐于顺治:Container在搜狐PaaS平台中的应用实践 【先锋】从代码层诊断,云端OneAPM平台让开发者专注开发 阿里将推无线领域重磅计划 阿里百川无线开放大会揭晓 提升网站转化率的四步优化方案 开发者应该了解的API技术清单! 【讲师】腾讯刘永峰:Docker时代,公有云面临的挑战和机遇 移动开发工具服务商Mob推出免费短信验证码SDK 遇见他们,MDCC 2014移动开发者大会嘉宾揭秘 揭秘全球最小无线耳机背后的技术 《最终幻想》之父访谈:我为何转战F2P游戏开发 寓教于乐 11款最适合教儿童编程的学习工具 苹果iPhone6获工信部许可 本月17日在内地发售 如何将C++中的string转变成char,我要将char变量与string中的字母作比较? 他们不上传图片也能显示图片,怪怪也.? 急!!!!REDHAT 7.2启动进不了X-windows界面,提示如下 rose2001中怎么找不到用例边界(方形)这个UML标记?有use-case package这个版型吗? __int8 _int16??菜鸟请教 哪有《Windows2000编程技术内幕》中文电子版? sql查询语句中将Null值转为0呢. 我自己编的控件为么有的机器能下载,有的不能? 如何加载控件? 强烈推荐!" 在QQ上如何弄的别人神经分裂???//owner: onice (西瓜的眼泪) " 请问如何在XML字符串中传递中文 压缩原理究竟是怎样的? 如何用javascript创建树形菜单 ftp 你的上网速度低于1m就不用看了 请问在VC中使用ADO连接Oracle数据库,如何判断连接断开 关于C++BUIDLER的学习 ====我的显示器以前好好的不知为什么现在闪呀闪的弄的我眼睛疼啊!我重装了系统又重装了显卡驱动程序,可是还是 闪!请问我该怎么办?谢 各位大哥,小弟有段初级链表程序,有些问题,请斑竹和高手解答,谢谢!!!!!! 如何让EDIT控件换行显示数据? 想考计算机系的研究生,请大家给点建议 各位大哥,小弟有段初级链表程序,有些问题,请斑竹和高手解答,谢谢!!!!!! 关于路径设置的问题,为什么没人回答呢??? 叶剑英的孙女,李泽楷和曾荫权都在追 100分送上!!我都快被ADO逼疯了!!!真他妈的服了,各位给我指点一下吧,急用呀!!! 在linux下的C对数据库编程中,嵌套SQL语句的格式 如何启动备份服务器! 如何在窗口下对datawindow的数据进行修改后保存? 火急!急!急!急!急JBuilder完全安装怎么没有InterBase,哪又怎么安装? 求救!!! 明天上班,终于结束失业期了。 一个ORACLE备份数据导入问题。请高手指点! VC和VB下好用的控件在delphi下不好用!是不是dll的问题? 明天上班了,同喜! 大家觉得POWERSOFT公司的PB9会推出WEB SERVICE功能吗? 一个ORACLE备份数据导入问题。请高手指点!!! 请教各位高手,DirectX环境下,是否可以利用各种输入法输入汉字? 急,高手帮忙。 getchar小问题,为什么程序不能中断? 我想学游戏编程,谁能指点一下?100分! 医疗管理系统 请帮忙看看这段流操作的代码错在哪里? javabean高手请进!请赐教!!! 请各位高手指点一下,什么软件开发java比较方便,效率较高? 谁能告诉我,怎样将邮箱中的信件复制到本地硬盘.谢了 需要什么权限才能在active directory里添加用户??(实际上是想添加email帐号),谢谢各位 test 请问在winXP里该如何实现如下功能呢? 再问一次,怎么在mandrake下设显示器的刷新率!怎么想给分都送不出去! 当用c++编程时,能不能不用回收内存?100分 用VC处理XML文档时遇到的一些细微而重要的问题 大家能不能给我给我点 虫洞、虫洞效应、虫洞理论,还有虫洞是不是有时光旅行这一方面,虫洞可靠吗? 光气和二氧化碳反应生成?要反应原理,算出来的给个算法 俄罗斯通古斯大爆炸到底是怎么回事?俄国军方的调查结果是什么?科学家的解释有哪些 有人说是外星人的飞船 虫洞,关于时空旅行((近光速飞行历史上最快的有人驾驶飞行器,是“阿波罗十号”.它达到每小时25000英里.但若想在时间中旅行,我们必须再快2000多倍.我们需要一部足以携带大量燃料的庞大 二氧化硫通入卤素单质(X2)的水溶液中(氯水、溴水或碘水) 有谁知道苯与甲苯,谁更易挥发呀? 时间是否会停止.宇宙外面是否还有宇宙.反物质,暗能量.究竟在何处,虫洞是否存在.宇宙是否会灭亡 卤素单质与SO2反应会褪色吗如题.SO2有漂白作用,SO2 + Br2 + 2H2O == H2SO4 + 2HBrSO2 + I2 + 2H2O == H2SO4 + 2HI但HI 、 HBr好像又有色 苯的挥发期是多长时间 铅铋混合溶液中铅铋含量测定的公式 钠和卤素单质反应方程式 苯多久能挥发完 铅铋合金中铋和铅的连续配位滴定1. 实验过程中,不使用已标定好的EDTA标准溶液,为什么还要改用金属锌作基准物质重新标定一次?2. 滴定bi3+要控制溶液酸度pH~1,酸度过低或过高对测定结果 10克10%的盐酸和10克10%的氢氧化钠溶液混合 混合后溶液能与下列物质反应的是A CuSO4溶液 BCO2 CCuO DH2SO4 苯多久能挥发净 请把碘量法测铜的具体过程和反应式列出来要正规.随便概述一下了事就不必发了. 是不是所有的金属都可以和水反应 苯如何挥发的慢 越南铅银矿石如何取样我是一名取样工作者,每次对越南铅银共生矿(原矿·铅:约60%银约3000克每干吨)总是第一次取样和第二次取的样不同:铅的含量一样,可是银的含量有200克至300克每干 铅铋混合液中铅铋连续测定中为什么要用六亚甲基四胺 金属与水反应哪些金属与能水反应,并写出方程式还有我好像记得AI与水在碱性才能反应对吗? 天津上金矿产21综合会员是什么单位 非金属单质能与酸反应吗?非金属单质能否与酸反应生成盐和氢气?如果能,请举例说明. 求硝酸铈安与银,镉的化学反应(说明反应产物)硝酸铈安分子式 (NH4)2Ce(NO3)6银 Ag镉 Ge 水银能转化为银吗,铅能转变为金吗? 一种金属单质与两种酸反应在线等哪种金属先反应比如HCl 与 AgNO3,Fe(NO3)2混合物哪个先反应 硝酸铈铵在实验室里如何鉴别? 单质和水反应能生成酸吗? H2S+H2SO3=? 下列物质中,既可与盐酸反应,又可以与氢氧化钠溶液反应的是A.NaHSO4 B.KHCO3 C.Na2CO3 D.NH4NO3 在短周期元素中,什么元素单质能与水反应生成两种酸?为什么不是Br或I 用电子式表示H2S的形成过程 硫酸会不会挥发 F 、Cl 、Br 、I四种单质与水反应容易程度为什么是F> Cl> Br >I呀 广州有没做氧化锌的厂,我们是做发泡鞋的,需要氧化锌!哪个牌子的好 【求助】如何分析滴定硝酸铈铵和硝酸混合液各组分的含量 SO2与CL单质的水溶液反应生成什么.写出化学方程式 佛山哪里有氧化锌卖,最好是厂家,我们做陶瓷原料用的 溴与二氧化硫的反应方程式 三氧化二铁 盐酸反应现象 现将含ZnO百分之50(其他成分不含锌)的矿石10吨与一定量的赤铜,木炭粉混合后加热到800度,反应完全可得到含锌百分之65的锌铜合金是多少吨?(列式计算,计算结果保留1位小数量 为什么硝酸比磷酸更易挥发 三氧化二铁与盐酸反应生成什么 可燃物本身的性质,氧气浓度的大小,可燃物与氧气的接触面积分别对燃烧有什么影响,举例说明.要举例子, 盐酸与硝酸谁更易挥发谢谢了,哪一个更易挥发啊 铅锌矿化验方法!要全面的,急.我想知道化验方法.结果的算法.还有药水的配制. 下列不属于燃烧条件的是 A. 可燃物 B. 温度 C. 氧气(空气) D. 接触面积大 硝酸易挥发而磷酸难挥发,为什么?不是键能的原因.是什么原因?是不是因为分子间作用力的大小? 铅锌矿中锌镉含量的测定的实验中 如果测铅应该怎样进行? H2S怎么制取Na2S 稀HNO3易挥发吗 ABC三种短周期元素处在同一周期,A单质与水反应时发生自身氧化还原反应,B单质雨水ABC三种短周期元素处在同一周期,A单质与水反应时发生自身氧化还原反应,B单质与水剧烈反应且B单质为还原 Na2S如何生成H2S RT 气体H2S用氢氧化钠吸收 请问整个反应过程是什么?为什么最后会生成NaHS而不是Na2S Na2S和水生成H2S吗? 通古斯大爆炸是怎么回事 世界上真有冲动吗,通过虫洞能进行时空旅行吗? Na2S和什么反应生成H2S?我应该和上一个问题一起问的.要两个方程式, 为什么会出现 通古斯大爆炸?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘