ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

字符函数与字符串函数

2022-02-04 21:31:03  阅读:146  来源: 互联网

标签:字符 函数 ++ s2 s1 char str2 字符串 str1


本篇博客介绍一些函数和如何模拟实现

strlen函数

介绍:计算字符串 str 的长度,直到空结束字符,但不包括空结束字符
原型:size_t strlen(const char *str)
返回值:返回字符串的长度

注意点
1.字符串是以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
2. 参数指向的字符串必须要以 ‘\0’ 结束。 注意函数的返回值为 size_t是无符号的


模拟实现strlen函数

常用递归和指针-指针的方法

1.递归

#include<stdio.h>
//递归实现                          //递归无非两步 初始条件和逼近条件
int my_strlen(char *str)
{
    if(*str=='\0')                         //如果数组为'\0'就返回0
    	return 0; 
    else
       return 1+my_strlen(str+1);          //不是'\0  1 + 指针+1 指向后一个元素              
}
int main()
{
    char arr[]="bite";
    printf("%d",my_strlen(arr));

	return 0;
}


2.指针-指针

指针-指针=指针中间元素个数

#include<stdio.h>

int my_strlen(char *str)
{
   char*begin=str;       //记录指针初始位置
   while(*str!='\0')
   		str++;          //循环记录str到'\0'之前的位置
   return str - begin;
}

int main()
{
    char arr[]="bite";
    printf("%d",my_strlen(arr));

	return 0;
}


strcpy函数 VS stcnpy 函数


char *strcpy(char *dest(接收被复制字符串), const char *src(被复制字符串)) 把src所指向的字符串复制到 dest。
在这里插入图片描述

模拟实现strcpy函数

#include<stdio.h>
int main()
{
    char arr1[]="bite";
    char arr2[10]={0}
    
    char *dest=arr1;             //把arr1首元素赋值给dest指针
    char *sec=arr2;              //把arr2首元素赋值给sec指针
    while(*sec++=*dest++)        // *优先级高于++
    {                            //先把'b'赋给sec  …………
             ;                   //到'\0' 会先赋值给sec然后才进行判断 因为while('\0')为假就不会往后
    }
    printf("%s",arr2);

	return 0;
}




char * strncpy ( char * destination, const char * source, size_t num )区别是strncpy可以指定需要复制多少个字符
在这里插入图片描述

如何理解第二句话
例子

#pragma warning(disable : 4996)
#include<stdio.h>
#include<string.h>
int main()
{
	char a[20] = "bite666666";
	char b[] ="peng";

	strncpy(a,b,6); //把b中6个字符复制到a  可以知道b只有5个元素 小于num 所以会补0
	return 0;
}

在这里插入图片描述
可以看到这里第6个元素a[5]赋成’\0’


strcat VS strncat


char * strcat ( char * destination, const char * source )

把scource接到destination后面并在scource最后补’\0’


注意:
在这里插入图片描述


char * strncat ( char * destination, const char * source, size_t num );

把scource中的num个字符接到destination后面并在scource最后补’\0’


模拟实现strcat函数

 char *my_strcat(char *dest, const char*src) 
 {
 		 char *ret = dest;
		 while(*dest)
 	     {
		   dest++;
		 }
		 while(*dest++ = *src++)
 		{
 					;
 		}
 return ret; 
 }



strcmp VS strncmp


strcmp函数功能是进行两个字符串的比较


函数原型: int strcmp ( const char * str1, const char * str2 )

在这里插入图片描述



函数原型:int strncmp ( const char * str1, const char * str2, size_t num );

比较字符串的前n个字符
str1, str2 为需要比较的两个字符串,num为要比较的字符的数目

在这里插入图片描述




模拟实现strcmp

原理: 字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值

int my_strcmp(const char *str1,const char *str2)
{
   while(str1 == str2)                //如果两个字符相同就++向后比
   {	
   		if(str1=='\0' &&str2 =='\0')
   			return 0;
   			
     	str1++;
     	str2++;
   }
   return *str1 -*str2;  //返回的是ASCII码值 如果 *str1 -*str2 >0 就说明str1>str2 反之str1<str2




strstr函数

作用:检索子串在字符串中首次出现的位置

char * strstr ( const char *str1, const char * str2)

检测str2有没有出现在str1中

返回字符串str1中第一次出现子串str2的地址;如果没有检索到子串,则返回NULL

#include<stdio.h>
#include<string.h>
int main()
{
    char *str1 = "bite is good";
    char *str2 = "is";
    char *s = strstr(str1, str2);
    printf("%s\n", s);
    return 0;
}

在这里插入图片描述




模拟实现strstr

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	char* s1 = NULL;           
	char* s2 = NULL;            
	
	char* cp = (char*)str1;    //把str1赋给cp让cp去遍历并记住位置
	while (*cp)                //cp遍历str1
	{
		s1 = cp;               //s1去接收每次要比较的字符
	    s2 = (char*)str2;     //s2去接收要和s1比的内容
		
        while (*s1 == *s2 && *s1 && *s2)    //找到一样的 并且都不等于斜杠0
		{
			s1++;                         //s1和s2 都++ 向后去比较下一个
			s2++;
			if (*s2 == '\0')       //当s2为\0 说明比较完成返回比较的地址
				return cp;
		}
		
		cp++;                    //当s1和s2 不等 cp++ 向后指向下一个字符去比较
	}
	return NULL;
}


/*例子 str1=“saatg” str2="at"   结果是atg

1. cp='s'  s1='s' s2='a' while (*s1 == *s2 && *s1 && *s2)不成立

2. cp++  cp='a' s1='a' s2='a'  while (*s1 == *s2 && *s1 && *s2)成立
   s1++  s2++   s1='a' s2='t'  if (*s2 == '\0')不成立 

3. 继续循环while (*s1 == *s2 && *s1 && *s2) s1 ='a' != s2='t' 不成立 cp++

4. cp='a' s1='a' s2='a'  while (*s1 == *s2 && *s1 && *s2)成立 
   s1++   s2++  s1='t'   s2='t'  if (*s2 == '\0')成立
   
5.继续while s1=t s2=t 相等成立 s1++ s2++ s1='g' s2='\0'  if (*s2 == '\0')不成立
6.return cp   此时cp返回第二个'a'的地址 


strerror

作用:返回错误原因的描述字符串

char * strerror ( int errnum )

strerror()用来依参数errnum 的错误代码来查询其错误原因的描述字符串, 然后将该字符串指针返回

个人觉得没有比perror函数好用

int main()
{
	FILE*pf=fopen("test1","r");
	if(pf =	NULL)
	{
		perror("fopen");
		return 1;
	}
	return 0;
}

在这里插入图片描述

perror( ) //括号填要输出的字



常用字符分类函数

在这里插入图片描述

标签:字符,函数,++,s2,s1,char,str2,字符串,str1
来源: https://blog.csdn.net/weixin_62007227/article/details/122782106

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有