再上一篇:第六章 数组
上一篇:6.2 字符数组的定义及应用
主页
下一篇:第七章 结构体、共同体和枚举类型
再下一篇:7.2 位域
文章列表

6.3 字符串处理函数

《VC++程序设计基础》,讲述C++语言的语法和标准库,以及Visual C++ 函数库和MFC类库的使用,并附相关代码示例。

在 C++中,为用户提供了处理字符串的库函数,这些函数都在头文件string.h中作了说明。本节介绍几个常用的字符串处理函数及使用方法。6.3.1 字符串处理函数

1、字符串的拷贝函数 strcpy (字符数组名1, 字符数组名2)

将字符数组名2中的字符串拷贝到字符数组名1中,这种拷贝连同字符串的结束符一起拷贝。如:

char str1[80]=”I am a student.”;

char str2[70];

strcpy(str2,str1);

将str1中的字符中拷贝到str2,使str2包含了字符串“I am a student.”

函数strcpy( )的第二个参数也可以是一个字符串,如:

char ss[90];

strcpy(ss,”我们是教师”);

执行后字符数组ss中就包含了字符串“我们是教师”。

2、实现二个字符串的拼接函数 strcat (字符数组名1, 字符数组名2)

将字符数组2中的字符串拼接到字符数组1中的字符串的后面,构成了一个新的字符串,并存放在字符数组1中。如:

char s1[80]=”学生”;

char s2[40]=”学习课程”;

strcat(s2,s1);

则s2中存放的字符串为:“学生学习课程”。

函数strcat()的第二个参数也可以是一个字符串,如:

char s3[60]=”You”;

strcat(s3,” are a students!”);

则s3中包含了字符串“You are a students!”。

3、字符串比较函数strcmp ( 字符串1, 字符串2)

该函数的二个实参均可以是字符数组名,或者是一个字符串。对二个字符串进行比较的规则是:从二个字符串的首字符开始自左至右逐个字符进行比较,这种比较是按字符的ASCII码值的大小来进行的,直到出现二个不同的字符或遇到字符串的结束符’\0’为止。如果二个字符串中的字符均相同,则认为二个字符串相等;当二个字符串不同时,则以自左至右出现的第一个不同字符的比较结果作为二个字符串的比较结果,并将这比较结果作为函数的返回值返回。若二个字符串相等,则返回0;若字符串1大于字符串2,返回一个正整数;若字符串1小于字符串2,返回一个负整数。

下面所定义的函数实现了函数strcmp( )相同的功能:

int stringcomp(char s1[],char s2[])

{

int j=0,k;

while( (k=s1[j]-s2[j])==0 && s1[j]) j++;

return k;

}

读者自行分析该函数的实现过程。

4、求字符串的长度函数strlen (字符串)

该函数的实参可以是字符数组名,也可以是字符串。这函数求出字符串中的字符个数(不包括字符’\0’)作为字符串的长度值,并返回该值。如:

char s6[80]=”People”;

cout<

cout<

A行的输出结果为6,B行的输出为4。

下面所定义的函数实现了函数strlen( )相同的功能:

int strlength(char s[ ])

{

int len=0;

while(s[len++]);

return len – 1;

}

5、大写字母变换成小写字母函数strlwr (字符数组名)

该函数将字符数组中存放的字符串中的所有大写字母变换成小写字母。

6、小写字母变换成大写字母函数strupr(字符数组名)

该函数将字符数组中存放的字符串中的所有小写字母变换成大写字母。

7、函数strncmp(字符串1,字符串2 , maxlen)

该函数的第一个和第二个参数均可为字符数组名或字符串,第三个参数为正整数,它限定了至多比较的字符个数。若字符串1或字符串2的长度小于maxlen的值时,这函数的功能与 strcmp( )相同。当二个字符串的长度均大于 maxlen的值时,maxlen为至多要比较的字符个数。如:

cout<

因二个字符串的前三个字符相同,所以输出的值为0。

8、函数strncpy(字符数组名1, 字符串2, maxlen)

第二个参数可以是数组名,也可以是字符串,第三个参数为一个正整数。当字符串2的长度小于maxlen的值时,这函数的功能与strcpy( )完全相同;当字符串2的长度大于maxlen的值时,只把字符串2中前面的maxlen个字符拷贝给第一个参数所指定的数组中。如:

char s[90],s1[90];

strncpy(s,”abcdssfsdfk”,3); //A

strncpy(s1,”abcdef”,90); //B

A 行仅拷贝前面的三个字符,s 中的字符串为“abc”。在 B 行中,由于字符串”abcdef”的长度小于90,将这字符串全部拷贝到s1中。

注意,二字符串之间不能直接进行比较, 赋值等操作, 这些操作必须通过字符串函数来实现。

6.3.2 字符数组的应用举例

例 6.12输入三个字符串,按升序排序后输出。

#include

#include

void strswap(char a[],char b[]) //实现二个字符串的交换

{

char t[80];

strcpy( t, a);

strcpy( a, b);

strcpy( b, t);

}

void main (void )

{

char s1[80],s2[80],s3[80],s[80];

cout<<"输入三行字符串:\n";

cin.getline( s1,80); //输入字符串

cin.getline( s2,80);

cin.getline( s3,80);

if ( strcmp( s1, s2) > 0 ) strswap(s1, s2);

if ( strcmp( s1, s3) > 0 ) strswap(s1, s3);

if ( strcmp( s2, s3) > 0 ) strswap(s2, s3);

cout << "排序后的结果为 : \n";

cout<< s1 << "\n";

cout<< s2 << "\n";

cout<< s3 << "\n";

}

这个程序比较简单,读者可自行分析程序的实现。

例 6.13 输入一行字符串, 统计其中有多少个单词, 单词之间用一个或多个空格隔开。

分析:假定每次输入一行字符串中均包含了合法的英语单词,并且只包含单词和空格,而不包含其它的字符。设输入的字符串放在数组s中。求单词个数可分以下二步来实现:

1、跳过开头的一个或多个空格字符,下标移到一个单词的开始位置。可用如下的循环语句来实现:

int i=0,count=0;

while(s[i] == ‘ ‘) i++;

2、单词的计数器count加1,接着要跳过这个单词,下标移到这个单词之后的第一个空格字符为止。可用如下语句来实现:

count++;

while(s[i] != ‘ ‘ )i++;

重复以上二步,直到把下标移到s中的字符串结束字符为止。完整的程序为:#include

#include

void main (void )

{

char s[200];

int count, i , j;

cout<<"输入一行字符串:\n";

cin.getline( s , 200);

for ( count =0, j = strlen(s) ,i = 0; i< j ; ) {

while ( s[i] == ' ' && i < j ) i++; //跳过空格字符

if ( i < j ) count ++; //单词数加1

while ( s[i ] != ' ' && i < j ) i++; //跳过一个单词

}

cout << "输入的字符串为:\n " << s << "\n";

cout << "字符串中包含的单词数为: " << count <<"\n";

}

程序执行时,若输入的一行字符串为:

You are a worker.

则输出:

字符串中包含的单词数为: 4

习题与思考6

1.读入一组整数到一维数组中,找出其中最大的偶数(若没有偶数时,输出“没有偶数!”)和最大的奇数并输出(若没有偶数(或奇数)时,输出“没有偶数(或奇数)!”)。2.输入一组非0整数(以输入0作为输入结束标志)到一维数组中,求出这一组数的平均值,并分别统计出这一组数中正数和负数的个数。

3.输入10个数到一维数组中,按升序排序后输出。分别用三个函数实现:一个实现数据的输入,一个实现排序,一个实现输出。

4. 输入n个数到一维数组中,求均方差:

i=n−1 2

D= ∑ (a −M)

i=0 i

其中

M =(i=n−1a )/n

i=0 i

3. 求一个4×4矩阵两对角线元素之和。

4. 先输入一个4×4的矩阵,转置后输出。如:

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

转置后为:

1 5 9 13

2 6 10 14

3 7 11 15

4 8 12 16

5.用一个二维数组float cla[50][2]来存放一个班级的二门课程(C++和计算机基础)的成绩。先输入一个班的人数(小于 50),再依次输入每一个人的二门课程的成绩。求出全班的平均成绩和每一门课程的平均成绩。

6.用cin.getline()将一个字符串输入到字符数组S(char S[200])中,删除字符串中的所有空格后输出。

7.用cin.getline()将一个字符串输入到字符数组中,按反序输出。如,输入“Abcd e”,则输出“e dcbA”。

8.编写一个函数:int strlen(char s[ ] );求出字符串s中包含的字符个数,并作为函数的返回值。(要求不使用C++的库函数strlen())。

9.编写一个函数:void strcpy(char a[ ], char b[]);将b中的字符串拷贝到数组a中。(要求不使用C++的库函数strcpy())。

10.编写一个函数:void strcat(char a[ ], char b[]);将b中的字符串拼接到数组a中的字符串的后面,构成一个字符串。(要求不使用C++的库函数strcat())。

11.用筛选取法求出2~200之间的所有素数。