电脑软硬件应用网
当前位置: 电脑软硬件应用网 > 设计学院 > 网络编程 > C语言 > 正文
C语言初学者入门讲座 第九讲 数组
C语言初学者入门讲座 第九讲 数组
2007-3-19 12:17:32  文/佚名   出处:电脑软硬件应用网   
4.2。设数组c的首地址为2000,也就是说c[0]单元地址为2000。则数组名c就代表这个首地址。因此在c前面不能再加地址运算符&。如写作scanf("%s",&c);则是错误的。 在执行函数printf("%s",c) 时,按数组名c找到首地址,然后逐个输出数组中各个字符直到遇到字符串终止标志'\0'为止。

  字符串常用函数

  C语言提供了丰富的字符串处理函数, 大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。 使用这些函数可大大减轻编程的负担。用于输入输出的字符串函数, 在使用前应包含头文件"stdio.h" ; 使用其它字符串函数则应包含头文件"string.h"。 下面介绍几个最常用的字符串函数。

  1.字符串输出函数 puts 格式: puts (字符数组名) 功能:把字符数组中的字符串输出到显示器。 即在屏幕上显示该字符串

#include"stdio.h"
main()
{
static char c[]="BASIC\ndBASE";
puts(c);
}
static char c[]="BASIC\ndBASE";
puts(c);

  从程序中可以看出puts函数中可以使用转义字符, 因此输出结果成为两行。puts函数完全可以由printf函数取代。 当需要按一定格式输出时,通常使用printf函数。

  2.字符串输入函数gets 格式: gets (字符数组名) 功能:从标准输入设备键盘上输入一个字符串。 本函数得到一个函数值,即为该字符数组的首地址。

#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的首地址。

#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);
}
static char st1[30]="My name is ";
int st2[10];
printf("input your name:\n");
gets(st2);
strcat(st1,st2);  

  本程序把初始化赋值的字符数组与动态赋值的字符串连接起来。 要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串

  4.字符串拷贝函数strcpy 格式: strcpy (字符数组名1,字符数组名2) 功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“\0”也一同拷贝。字符数名2, 也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。

#include"string.h"
main()
{
 static char st1[15],st2[]="C Language";
 strcpy(st1,st2);
 puts(st1);printf("\n");
}
static char st1[15],st2[]="C Language";
strcpy(st1,st2);

  本函数要求字符数组1应有足够的长度,否则不能全部装入所拷贝的字符串。

  5.字符串比较函数strcmp 格式: strcmp(字符数组名1,字符数组名2) 功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。

  字符串1=字符串2,返回值=0;
  字符串2〉字符串2,返回值〉0;
  字符串1〈字符串2,返回值〈0。
  本函数也可用于比较两个字符串常量,或比较数组和字符串常量。

#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");
}
{
 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’) 并作为函数返回值。

#include"string.h"
main()
{
 int k;
 static char st[]="C language";
 k=strlen(st);
 printf("The lenth of the string is %d\n",k);
}


  程序举例

  把一个整数按大小顺序插入已排好序的数组中。 为了把一个数按大小插入已排好序的数组中, 应首先确定排序是从大到小还是从小到大进行的。设排序是从大到小进序的, 则可把欲插入的数与数组中各数逐个比较, 当找到第一个比插入数小的元素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");
 }
 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;

  本程序首先对数组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之间。

  在二维数组a中选出各行最大的元素组成一个一维数组b。 a=3 16 87 65 4 32 11 108 10 25 12 37b=(87 108 37) 本题的编程思路是,在数组A的每一行中寻找最大的元素,找到之后把该值赋予数组B相应的元素即可。程序如下:

main()
{
 static 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(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;
}

  程序中第一个for语句中又嵌套了一个for语句组成了双重循环。外循环控制逐行处理,并把每行的第0列元素赋予l。进入内循环后,把l与后面各列元素比较,并把比l大者赋予l。内循环结束时l 即为该行最大的元素,然后把l值赋予b[i]。等外循环全部完成时,数组b中已装入了a各行中的最大值。后面的两个 for语句分别输出数组a和数组b。

  输入五个国家的名称按字母顺序排列输出。

  本题编程思路如下:五个国家名应由一个二维字符数组来处理。然而C语言规定可以把一个二维数组当成多个一维数组处理。 因此本题又可以按五个一维数组处理, 而每一个一维数组就是一个国家名字符串。用字符串比较函数比较各一维数组的大小,并排序, 输出结果即可。

  编程如下:

void 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(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);
  }
 }
}  

  本程序的第一个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号元素的排序值。然后输出该字符串。在外循环全部完成之后即完成全部排序和输出。

  本章小结

  1.数组是程序设计中最常用的数据结构。数组可分为数值数组(整数组,实数组),字符数组以及后面将要介绍的指针数组,结构数组等。

  2.数组可以是一维的,二维的或多维的。

  3.数组类型说明由类型说明符、数组名、数组长度 (数组元素个数)三部分组成。数组元素又称为下标变量。 数组的类型是指下标变量取值的类型。

  4.对数组的赋值可以用数组初始化赋值, 输入函数动态赋值和赋值语句赋值三种方法实现。 对数值数组不能用赋值语句整体赋值、输入或输出,而必须用循环语句逐个对数组元素进行操作。

上一页  [1] [2] 

  • 上一篇文章:

  • 下一篇文章:
  • 最新热点 最新推荐 相关文章
    C语言初学者入门讲座 第十五讲 预处…
    C语言初学者入门讲座 第十四讲 枚举…
    C语言初学者入门讲座 第十三讲 联合
    C语言初学者入门讲座 第十二讲 结构
    C语言初学者入门讲座 第十二讲 多维…
    C语言初学者入门讲座 第十一讲 指针…
    C语言初学者入门讲座 第十讲 函数
    C语言初学者入门讲座 第八讲 转移语…
    C语言初学者入门讲座 第七讲 循环结…
    C语言初学者入门讲座 第六讲 分支结…
    关于45IT | About 45IT | 联系方式 | 版权声明 | 网站导航 |

    Copyright © 2003-2011 45IT. All Rights Reserved 浙ICP备09049068号