strstr函数
简介
const char * strstr ( const char * str1, const char * str2 );
strstr函数用于在str1指向的字符串中查找str2,并将找到的第一个str2的首元素地址返回,若未找到,则返回一个空指针。
#include<stdio.h>
#include<string.h>
int main()
{
char str1[40] = "I love China very much!";
const char* str2 = "China";
char*p=strstr(str1, str2);
printf("%s", p);
return 0;
}
p接收strstr函数返回的China部分第一个字符C的地址。
未在str1中找到US字符串,返回NULL空地址。
模拟实现
#include<stdio.h>
#include<string.h>
char* my_strstr(const char* str1,const char* str2)
{
const char* s1=NULL;
const char* s2=NULL;//s1,s2用于遍历检索数组
const char* cur = str1;//cur用于记录开始检索的地址
if (*str2 == '\0')
return (char*)str1;
while (*cur)//str1第一个元素开始向后检索
{
s1 = cur;
s2 = str2;
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)//找到相同字符
{
s1++;
s2++;//继续比较下一个字符是否相等
}
if (*s2 == '\0')//s2遍历完str2,说明上一个循环找到了与str2相同的部分,返回该部分第一个字符地址
return (char*)cur;
cur++;//从str2的下一个元素开始检索
}
return NULL;//未找到,返回空指针
}
int main()
{
char str1[40] = "I love China very much!";
const char* str2 = "US";
const char*p=my_strstr(str1, str2);
printf("%s", p);
return 0;
}
strncpy函数
char * strncpy ( char * destination, const char * source, size_t num );
在strcpy函数的基础上增加了一个形参num,表示从source复制到destination的字符个数,由于该形参的存在,可以直观看出向目标数组复制的字符个数,从而可以避免复制过多字符导致目标数组溢出,较strcpy更加安全。
int main()
{
char a1[20] ="xxxxxxxxxxxxxxxxxx";
char a2[] = "hello world";
strncpy(a1, a2,7);
printf("%s", a1);
return 0;
}
strncat函数
char * strncat ( char * destination, const char * source, size_t num );
strncat函数相较于strcat函数,增加了num形参,可以将前num个字符连接到destination字符串尾部,而不是全部连接。
int main()
{
char a1[20] ="xxxxxxxxx";
char a2[] = "hello world";
strncat(a1, a2,7);
printf("%s", a1);
return 0;
}
strncmp函数
int strncmp ( const char * str1, const char * str2, size_t num );
strncmp函数相较于strcmp函数多了形参num,可以只比较str1与str2的前num个字符(关于strncmp函数如何进行比较,请参考《C语言字符串函数的使用与模拟实现(一)》strcmp函数部分 http://t.csdnimg.cn/eBqdC)。
该代码在strcmp函数下运行结果应是一个负数,因为字符e后a1为'\0',a2为f。但在strncmp下,只比较前两个字符,前两个字符相等,故而返回0。
字符分类转换函数
(包含在头文件ctype.h中)
islower
int islower ( int c );
检查字符c是否为小写字母,若不是是,返回0(为假);若是,返回不是0的一个数字(为真)。
因为110是字母n的ascll码,因而返回2。由形参int也可以看出字母实参被计算的也是它的ascll码。
isupper
int isupper ( int c );
与islower相似,检查字符c是否为大写字母,若不是是,返回0(为假);若是,返回不是0的一个数字(为真)。
toupper
int toupper ( int c );
将小写字母转换为大写字母,如果该字符本来就是大写字母或者不是字母,则返回他自己原来的值。
tolower
int tolower ( int c );
与toupper相似,将大写字母转换为小写字母如果该字,符本来就是小写字母或者不是字母,则返回他自己原来的值。
ispunct
int ispunct ( int c );
检查字符c是否为标点符号(不同C语言标准关于标点符号的定义不同,可用该函数逐一分类),若是,返回不为0的数;若不是,返回0。
由此可见,转义字符'\n'在该标准下不是标点符号。
isgraph
int isgraph ( int c );
检查 c 是否为具有图形表示形式的字符,即是否为除空格(“ ”)外的可打印字符。
若是,返回一个非0数;若不是,返回0。
ascll码表中前32个字符为控制字符不可打印,因为返回0;而33——126为打印字符,故33返回一个非0数。
isprint
int isprint ( int c );
基本与isgraph函数相同,检查 c 是否为具有图形表示形式的字符,与其不同的是在isprint中空格(" ")也为可打印字符返回一个非0数。
空格字符返回非0数。