C程序设计讲义
数组(理论三)
教学目的:
1.了解字符数组的基本概念
2.掌握字符类型变量的定义与引用
3.字符数组的定义与引用、常用字符串处理函数及字符处理函数
教学重(难)点:
字符数组的定义与引用、常用字符串处理函数及字符处理函数
授课形式:
    理论
教学条件:
    多媒体
教学内容:
复习:一维数组的使用,二维数组的使用
新课:
字符数组
字符数组:存放字符型数据的数组。其中每个数组元素存放的值都是单个字符。
字符数组分为一维字符数组和多维字符数组。一维字符数组常常存放一个字符串,二维字符数组常用于存放多个字符串,可以看作是一维字符串数组。
1. 字符数组的定义、初始化及引用
字符数组也是数组,只是数组元素的类型为字符型。所以字符数组的定义、初始化,字符数组数组元素的引用与一般的数组类似。(定义时类型说明符为char,初始化使用字符常量或
相应的ASCII码值,赋值使用字符型的表达式,凡是可以用字符数据的地方也可以引用字符数组的元素)。
例如:
char c1[10],str[5][10];
char c2[3]={‘r’,’e’,’d’};或char c2[]={‘r’,’e’,’d’};
printf(“%c%c%c\n”,c2[0],c2[1],c2[2]);
2. 字符串与字符数组
1).字符串与字符数组
字符串(字符串常量):字符串是用双引号括起来的若干有效的字符序列。C语言中,字符串可以包含字母、数字、符号、转义符。
字符数组:存放字符型数据的数组。它不仅用于存放字符串,也可以存放一般的、对一般读者看来毫无意义的字符序列。
C语言没有提供字符串变量(存放字符串的变量),对字符串的处理常常采用字符数组实现。C语言许多字符串处理库函数既可以使用字符串,也可以使用字符数组。
为了处理字符串方便,C语言规定以’\0’ASCII码为0的字符)作为“字符串结束标志”。如果不是处理字符串,字符数组中可以没有字符串结束标志
例如:
char str1[]={‘C’,’H’,’I’,’N’,’A’};
str1:字符数组,占用空间5个字节
C
H
I
N
A
char str2[]=”CHINA”; 占用空间6个字节
C
H
I
N
A
‘\0’
2).字符数组的初始化(除了一般数组的初始化方法外,增加了一些方法)
(1) 字符常量的形式对字符数组初始化。
注意:这种方法,系统不会自动在最后一个字符后加’\0’
例如:char str1[]={‘C’,’H’,’I’,’N’,’A’};char str1[5]={‘C’,’H’,’I’,’N’,’A’};没有结束标志。如果要加结束标志,必须明确指定。char str1[]={‘C’,’H’,’I’,’N’,’A’,’\0’};
初始化为0,相当于有字符串结束标志
(2) 字符串(常量)的形式对字符数组初始化。(系统会自动在最后一个字符后加’\0’
例如:char str1[]={”CHINA”};char s1[6]=”CHINA”;
char str2[80]={”CHINA”};char s2[80]=”CHINA”;
3).字符数组的输入输出(两种形式:逐个字符输入/输出,整串输入/输出
(1) 逐个字符输入/输出:采用“%c”格式说明和循环,像处理数组元素一样输入输出一个字符。
说明:
格式化输入是缓冲读。必须在接受到“回车”时,scanf才开始读取数据。
读字符数据时,空格、回车都保存进字符数组。
如果按“回车”键时,输入的字符少于scanf循环读取的字符时,scanf继续等待用户将剩下的字符输入;如果“回车”键时,输入的字符多于scanf循环读取的字符时,scanf循环只将前面的字符读入。
逐个读入字符结束后,不会自动在末尾加’\0’。所以输出时,最好也使用逐个字符输出。
(2) 整串输入/输出:采用“%s”格式符来实现
charc[]={“china”};
  printf(“%s”,c);
在内存中是意’\0’结束,因此输出时遇到’\o’就停止输出。故输出结果为china
注意
输出字符不包括’\0’
s’格式输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名
判断:  printf(“%s”,c[0]);
如果数组长度大于字符串的实际长度也只输出到遇’\0’结束。
如果一个字符数组中包含一个以上的’\0’则遇到一个’\0’时输出就结束
可以用scanf输入一个字符串,例如 scanf(”%s”,c);c是数组名他应该在输入以前被定义。
从键盘输入字符串时,应该注意应短于已定义的字符数组的长度
注意scanf函数中输入项是字符数组名时,不要在前面加&
3.字符串(字符数组)处理函数
1.字符串输入,输出函数(<stdio.h>)
(1) 字符串输入gets(str);
功能:从键盘终端输入一个字符串(可包含空格),直到遇到回车符,并将字符串存放到由str指定的字符数组(或内存区域)中。
参数:str是存放字符串的字符数组(或内存区域)的首地址
(2) 字符串输出puts(str);
功能:从str指定的地址开始,依次将存储单元中的字符输出到显示器,直到遇到“字符串”结束标志。
注意:puts将字符串最后的’\0’转化为’\n’并输出
2. 字符串处理函数(<string.h>)
(1) 字符串长度测量函数strlen(str1)
如: strlen”china”
(2) 字符串连接函数strcat(str1,str2)
功能:将str2为首地址的字符串连接到str1字符串的后面,str1原来的’\0’(字符串结束标志)处开始连接,将结果放在str1里面。
(3) 字符串复制函数strcpy(str1,str2)
功能:将str2为首地址的字符串复制到str1为首地址的字符数组中。
  Char str1[10],str[]={“china”};c 字符串转数组
  Strcpy(str1,str2);
(4) 字符串比较函数strcmp(str1,str2)
功能:将str1,str2为首地址的两个字符串进行比较,比较的结果由返回值表示。
str1=str2,函数的返回值为:0
str1<str2,函数的返回值为:负整数;
str1>str2,函数的返回值为:正整数;
字符数组应用举例
例:输入一行字符,统计其中有多少个单词,单词之间用空格隔开
include “stdio.h”
    void main()
      {  char string[81];
        Int I,num=0,word=0;/*num用来统计单词个数,word用来判别是否单词的标志*/
        char c;
        gets(string);
        for(i=0;(c=string[i])!=’\0’;i++)
            if(c==’ ‘) word=0;
            else if(word==0)  /*判断前面是否有空格,若有则证明有单词,num++*/
                {  word=1;
                  num++;
                }
printf(“there are %d words in the line\n”,num);
}
例:编写一个程序,将字符数组s2中的全部字符拷贝到字符数组S1中,不用strcpy函数,拷贝时,’\0’也要拷贝过去。’\0’后面的字符不拷贝。
include “stdio.h”
  void main()
{ char from[80],to[80];
  int i;
  printf(“please input string:”);
  scanf(“%s”,from);
  for(i=0;i<=strlen(from);i++)
    to(i)=from(i);
    printf(“after copy string is :%s\n”,to);
}
例:有一行电文,已按下面规律译成密码。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。