字符串处理
库函数
字符函数库
include <ctype.h>
函数原型 | 功能 | 返回值 |
int isalnum(int ch); | 判断ch是否是数字或字母字符 | 返回非零值,否则返回0 |
int isalpha(int ch); | 判断ch是否是字母 | 如果ch是字母,返回非零值,否则返回0 |
int iscntrl(int ch); | 判断ch是否是控制字符 | 如果ch是控制字符,返回非零值,否则返回0 |
int isdigit(int ch); | 判断ch是否是数字(0~9) | 如果ch是数字,返回非零值,否则返回0 |
int islower(int ch); | 判断ch是否是小写字母 | 如果ch是小写字母,返回非零值,否则返回0 |
int isupper(int ch); | 判断ch是否是大写字母 | 如果ch是大写字母,返回非零值,否则返回0 |
int isxdigit(int ch); | 判断ch是否是十六制数字字符 | 如果ch是十六制数字字符,返回非零值,否则返回0 |
int tolower(int ch); | 将大写字母转换成小写字母 | 如果ch是大写字母,返回对应小写字母,否则返回ch |
int toupper(int ch); | 将小写字母转换成大写字母 | 如果ch是小写字母,返回对应大写字母,否则返回ch |
注:此处只提供部分函数,需要更多资料需查阅相关文档
应用举例
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
/*这个程序用来统计输入字符串中数字字符的个数*/
int main()
{
char str[50];
int i=0,n=0;
printf("输入字符串:");
gets(str);
while(str[i]!='\0')
if(isdigit(str[i++]))n++;
printf("其中数字字符的个数是:%d\n",n);
return 0;
}
结果:
解析:
使用了C语言自带的库函数isdigit来实现判断数字字符的目的
串处理函数
include <string.h>
函数原型 | 功能 | 返回值 |
char *strcat(char *str1,const char *str2); | 将str2连接到str1后面 | 返回str1 |
char *strchr(const char *str,int ch); | 查找字符ch在str中第一次出现的位置 | 查找成功,返回指向字符ch在str中第一次出现的位置指针,否则返回null |
int strcmp(const char *str1,const char *str2); | 按字典方式比较字符串str1与字符串str2 | 如果str1小于str2,返回一个负数;如果str1等于str2,返回一个0;否则返回一个正数 |
char *strcpy(char *str1,const char *str2); | 复制字符串str2到字符串str1中 | 返回str1 |
size_t strlen(const char *str); | 求字符串str的长度 | 返回字符串str的长度 |
应用举例
代码示例1:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*这个程序用来测试串处理函数strcat*/
int main()
{
char str1[50]="GOOD ",str2[5]="good ";
strcat(str1,"morning");
printf("%s",str1);
strcat(str2,"morning");
printf("\n%s",str2);
return 0;
}
结果:
解析:
1.如上所示,第一次调用strcat十分成功。将GOOD 和morning连接了起来。
2.str2的字符数组长度只有5,小于good morning需求的长度。所以调用strcat之后输出了奇怪的东西,这也算是一种数组越界。
代码示例2:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*这个程序用来测试串处理函数strcmp*/
int main()
{
printf("%d\n",strcmp("abcdef","abdeff"));
printf("%d\n",strcmp("abcdef","abCdef"));
printf("%d\n",strcmp("abc","abcdef"));
printf("%d\n",strcmp("abc","abc"));
return 0;
}
结果:
解析:
1.strcmp函数的比较实质是比较ASCII码值,将两个字符串从左到右逐个比较,直到出现不同的字符或遇到'\0'。
2.两个字符串第一个不相同的字符的ASCII码值的大小将决定结果;只有全部字符相同,才认为相等。
代码示例3:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*这个程序用来测试串处理函数strlen*/
int main()
{
char str1[50]="good morning!";
printf("%d",strlen(str1));
return 0;
}
结果:
解析:
如上,strlen输出的不是字符数组的长度,而是不包含\0的字符串的长度。
编写自己的字符处理函数
代码示例1:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*这个程序用于测试字符串的复制*/
char *scopy1(char*,const char*);
char *scopy2(char*,const char*);
int main()
{
char str2[20]="type1",str1[20];
printf("使用库函数:%s\n",strcpy(str1,str2));
printf("使用下标法:%s\n",scopy1(str1,str2));
printf("使用指针法:%s\n",scopy2(str1,str2));
return 0;
}
char *scopy1(char *str1,const char *str2)
{
int i=0,j=0;
while(str1[i++]=str2[j++]);
return str1;
}
char *scopy2(char *str1,const char *str2)
{
char *p1=str1,*p2=str2;
while(*p1++=*p2++);
return str1;
}
结果:
解析:
1.如上,使用库函数strcpy可以实现字符串的复制
2.理解字符串的原理,可以自己写出相同效果的代码。如上的scopy1和scopy2
3.自己写的代码可以做更多的变通,使用更加灵活。应该掌握这种能力。
4.应该认识到,字符串即数组,所以str1=str2这种形式是不可行的。
代码示例2:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
/*这个程序用来实现不区分大小写的比较字符串*/
int scomp(const char*,const char*);
int main()
{
printf("%d\n",scomp("PFXa","pfXA"));
printf("%d\n",scomp("PF12","pF34"));
printf("%d\n",scomp("Bxb3","bdeF"));
return 0;
}
int scomp(const char *str1,const char *str2)
{
const char *p=str1,*q=str2;
while(tolower(*p)==tolower(*q)&&*p!='\0'&&*q!='\0')
{
p++;
q++;
}
/*当循环结束,即str1和str2完全相等,或*p和*q不相等*/
if(tolower(*p)>tolower(*q))
return 1;
else if(tolower(*p)<tolower(*q))
return -1;
else
return 0;
}
结果:
解析:
1.如上,通过自己编写函数,能够灵魂的实现需要的功能
2.使用tolower函数将所有字母都转成小写再进行比较能够实现不区分大小写。
代码示例3:
#include <stdio.h>
#include <stdlib.h>
/*
统计单词个数
输入一个英文句子,每个单词用个数不等的空格隔开,要求统计其中的单词的个数
*/
int wordnum(const char*);
int main()
{
char s[81];
gets(s);
printf("\"%s\"have%dwords.\n",s,wordnum(s));
return 0;
}
int wordnum(const char *str)
{
int i,num=0,word=0;
for(i=0;*(str+i)!='\0';i++)//此处虽然变量名是str,但实际上是通过指针法访问字符串各元素的
{
if(*(str+i)==' ')//每次读到空格就使word为0
word=0;
else if(word==0)//当没读到空格,而word又为0时,说明此时读到了单词的首字母
{
word=1;//将word置为1,表示正在读单词
num++;//单词计数增加
}
}
return num;
}
结果:
解析:
这段代码解决了一个实际问题:统计单词的个数。这个问题的难点是单词间的空格数目是不确定的。
而这里给出的解决方案是使用一个变量word来标识不同的读取状态。