P4-3【应用数组进行程序设计 | 第三节】——知识要点:字符数组
知识要点:字符数组
视频:
P4-3【应用数组进行程序设计 | 第三节】——知识要点:字符数组
目录
一、任务分析
二、必备知识与理论
三、任务实施
一、任务分析
本任务要求输入一行字符,统计其中的单词数,单词之间用空格隔开。
1.输入一行字符,将这一行字符放到一个一维的字符数组中;
2.先从字符数组中读取一个字符赋给某个字符变量,然后再判断它是不是结束符;
3.下面就是判断新单词出现没有的算法问题了,新单词出现,计数器的值加1,新单词没出现,计数器的值不变。
二、必备知识与理论
1.字符数组的定义和引用
用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。
(1)字符数组的定义
char 数组名[下标];
例如:char c[10];
字符是以ASCII码的形式存储在内存中,字符数组的任一元素相当于一个字符变量。
由于字符型与整型是互相通用的,因此上面的定义也可改为:
int c[10];
和数值数组一样,字符数组也可以是二维或多维数组。例如:
char e[8][9];
(2)字符数组的引用
可以引用字符数组中的一个元素,得到一个字符。
2.字符数组的初始化
字符数组的初始化和数值型数组初始化的规则一样。
对字符数组初始化,最容易理解的方式是将字符逐个赋给数组中各元素。例如:
char c[10]={ 'V','e','r','y',’','g','o','o','d','!' };
把10个字符依次赋值给c[0]到c[9]的10个元素。
3.字符串和字符串结束标志
在C语言中,不提供字符串数据类型,字符串是存放在字符数组中的。C语言规定:以'\0'作为字符串结束标志。因此,在用字符数组存放字符串时,系统会自动在最后一个字符后加上结束标志'\0',表示字符串到此结束。这样在定义字符数组时,数组长度至少要比字符串中字符个数多1,以便保存字符'\0'。
4.字符数组的输入、输出
关于字符数组的输入/输出,有两种方法:
(1)单个字符输入输出:
①用标准输入输出函数scanf()和printf(),使用格式符"%c",实现输入或输出一个字符。
②用单个字符输入输出函数getchar()和putchar()。
(2)整个字符串输入输出:
①用标准输入输出函数scanf()和printf(),使用格式符"%s",实现整个字符串一次性的输入或输出。
②用gets()函数和puts()函数实现字符串的输入输出。
格式:gets(字符数组名)
作用:从终端读入一个字符串到字符数组,直到遇到换行符,换行符不进入字符串, 它被转换为'\0',并作为字符串的结束标志。
格式:puts(字符数组名或字符串常量)
作用:将一个字符串(必须以'\0'作为结束标志)输出到终端,一次只能输出一个字符串。
scanf()函数和printf()函数的输入输出项是字符数组名,而不是数组元素名。
注意:用puts和gets函数只能输入或输出一个字符串,不能写成:puts(str1,str2)或gets(strl,str2)。
5.字符串处理函数
在C的函数库中提供了一些关于字符串的函数,使得处理字符串的操作十分简单方便。几乎所有版本的C都提供这些函数。这里介绍几种常用的字符串处理函数,字符串处理函数原型在string.h中。
(1)字符串长度测试函数strlen
格式:strlen(字符数组)
(2)字符串连接函数strcat
格式:strcat(字符数组1,字符数组2)
(3)字符串拷贝函数strcpy
格式:strcpy(字符数组1,字符串2)
(4)字符串比较函数strcmp
格式:strcmp(字符串1,字符串2)
(5)大写字母转换成小写字母函数strlwr
格式:strlwr(字符串)
(6)小写字母转换成大写字母函数strupr
格式:strupr(字符串)
三、任务实施
输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。
算法分析:
(1)程序中变量i作为循环变量,num用来统计单词个数,word作为判别是否单词的标志。若word=0表示未出现单词,如出现单词word就置成1。
(2)解题的思路是这样的:单词的数目可以由空格出现的次数决定(连续的若干个空格作为出现一次空格;一行开头的空格不统计在内)。如果测出某一个字符为非空格,而它的前面的字符是空格,则表示“新的单词开始了”此时使num(单词数)累加1。如果当前字符为非空格而其前面的字符也是非空格,则意味着仍然是原来那个单词的继续,num不应再累加1。前面一个字符是否空格可以从word的值看出来,若word=0,则表示前一个字符是空格,如果word=1,表示前一个字符为非空格。
#include <stdio.h>
main()
{char string[80];int i,num=0,word=0;char c;gets(string);for(i=0;(c=string[i])!='\0';i++)if(c==' ') word=0;else if(word==0){ word=1;
num++; }
printf("There are %d words in the line.\n",num);
}
运行情况如下:
This is a c program.↙
There are 5 words in the line.
程序中for语句中的“循环条件”为
(c=string[i])!='\0'
它的作用是先将字符数组的某一元素(一个字符)赋给字符变量c。此时赋值表达式的值就是该字符,然后再判定它是否结束符。这个“循环条件”包含了一个赋值操作和一个关系运算。可以看到用for循环可以使程序简练。