C语言字符串函数的使用与模拟实现(二)

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数。

  • 25
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值