字符串函数(strlen,strcpy,strcat,strcmp,strstr,strtok)

目录

一. strlen - 字符串长度

1.函数介绍

2.模拟实现

二.  strcpy  -  字符串拷贝

1.函数介绍

2.模拟实现

3. strncpy 

三. strcat - 字符串追加

1.函数介绍

2.模拟实现

 3.strncat

四. strcmp - 字符串比较

1.函数介绍

2.模拟实现

3.strncmp

 五.  strstr - 找子串

1.函数介绍

2.模拟实现

六. strtok -  字符串拆分

1.函数介绍

2.函数使用


一. strlen - 字符串长度

1.函数介绍

size_t strlen ( const char * str );

strlen函数用于求字符串长度,strlen所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0').

重点:

  • 字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
  • 参数指向的字符串必须要以 '\0' 结束。
  • 注意函数的返回值为size_t,是无符号的( 易错 )
//小测试
#include <stdio.h>
int main()
{
 const char*str1 = "abcdef";
 const char*str2 = "bbb";
 if(strlen(str2)-strlen(str1)>0)
 {
 printf("str2>str1\n");
 } 
 else
 {
 printf("srt1>str2\n");
 }
 return 0; }

 

2.模拟实现

size_t my_strlen1(char* str) //计数器法
{
	assert(str);
	size_t count = 0;
	while (*str)
	{
		count++;
		str++;
	}

	return count;
}

size_t my_strlen2(char* str) //指针 - 指针法
{
	assert(str);
	char* temp = str;
	
	while (*temp)
	{
		temp++;
	}

	return temp - str;
}

size_t my_strlen3(char* str) //递归
{
	assert(str);
	if (*str != '\0')
	{
		return 1 + my_strlen3(++str);
	}
	else
	{
		return 0;
	}

}

二.  strcpy  -  字符串拷贝

1.函数介绍

char* strcpy(char * destination, const char * source );

strcpy函数是将一个字符串拷贝到另一个字符串空间中,目的空间的内容会被覆盖。两个参数均为指针,把 source 中的内容 拷贝到 dest 目的空间中,返回值是目的空间的地址,即 dest

重点:

  • 源字符串必须以 '\0' 结束 
  • 会将源字符串中的 '\0' 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变

 

2.模拟实现

char* my_strcpy(char* dest, const char* source)
{
	assert(dest && source); //两个指针都不能为空
	char* ret = dest;       //用于返回拷贝后的地址
	while (*dest++ = *source++)  //source = ‘\0’ 为结束条件
	{
		;
	}

	return ret;
}

3. strncpy 

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

与上述函数不同的一点是多了一个 num , 可以控制想要拷贝字符的个数。

重点:

  • 拷贝num个字符从源字符串到目标空间。
  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后面追加0 ,直到num个

三. strcat - 字符串追加

1.函数介绍

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

strcat函数将 source 指向的字符串内容追加到 dest 所指向字符串的后面, 返回追加后的字符串,即 返回 dest

重点:

  • 源字符串必须以 '\0' 结束。
  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改。

2.模拟实现

char* my_strcat(char* dest, const char* source)
{
	assert(dest && source); //两个指针不能为空
	char* ret = dest;  //记录原地址,用于返回

    //找到 ‘\0’
	while (*dest)
	{
		dest++;
	}

    //追加
	while (*dest++ = *source++)
	{
		;
	}

	return ret;
}

 

 3.strncat

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

与上述函数不同的一点是多了一个 num , 可以控制想要追加字符的个数。

重点:

  • 追加num个字符从源字符串到目标空间。
  • 如果源字符串的长度小于num,则追加完源字符串之后,在目标的后面追加0 ,直到num个

四. strcmp - 字符串比较

1.函数介绍

int strcmp ( const char * str1, const char * str2 );

strcmp函数是用于比较两个字符串内容的函数。它的参数是两个指针,指向两个比较的字符串,它的返回值是一个数字 , 当str1大于str2的时候返回一个大于0的数;当str1等于str2的时候返回0;当str1小于str2的时候返回一个小于0的数。

重点:

  • 字符串比较的不是字符串长度的大小,而是两个字符串中对应位置字符的ASCII值。

 

2.模拟实现

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2); //比较的字符串不能为空

	while (*str1 == *str2)
	{
		if (*str1 == '\0')//比较到了结尾且都为'\0'
			return 0;

		str1++;  //一直向后走进行比较
		str2++;
	}

	return str1 - str2; //两个字符的ASCII码相减
}

 

3.strncmp

int strncmp ( const char * str1, const char * str2, size_t num );

strncmp可以控制想要比较字符的个数

例如:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "123456";
	char arr2[] = "123467";
	int ret1 = strncmp(arr1, arr2, 4);  // 0 
	int ret2 = strncmp(arr1, arr2, 5);  //返回-1 
	return 0;
}

 五.  strstr - 找子串

1.函数介绍

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

strstr 函数在 字符串str1 中查找 子串str2  , 查找成功返回  str1中子串的首元素地址,查找失败返回NULL。

2.模拟实现

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2); //两个字符串均不为空

	char* str = str1;
	char* s1;
	char* s2;

	if (*str2 == '\0') //子串为空串,返回str1
		return str;

	while (*str) //相当于从str1一个一个字符进行尝试
	{
		s1 = str;
		s2 = str2;
		while (s1 && s2 && *s1 == *s2) //只有两个字符相当才向后走
		{
			s1++;
			s2++;
		}

		if (s2 == '\0') //相当于走到了str2的结尾处,找到了子串
			return str;

		str++;
	}

	return NULL;  //str1 中所有的情况都尝试了,但是没有找到子串
}

六. strtok -  字符串拆分

1.函数介绍

char * strtok ( char * str, const char * sep );
  • sep参数是个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改 变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。(static 静态变量)
  • 如果字符串中不存在更多的标记,则返回 NULL 指针。

 

2.函数使用

//自己使用一下吧

#include <stdio.h>
int main()
{
 char *p = "GSX.MIUI@XiaoMI.com";
 const char* sep = ".@";
 char arr[30];
 char *str = NULL;
 strcpy(arr, p);    //将数据拷贝一份,处理arr数组的内容
 for(str=strtok(arr, sep); str != NULL; str=strtok(NULL, sep))
 {
    printf("%s\n", str);  
 }

}

上一篇:通过os和requests对接口请求进行封装


下一篇:python爬虫之requests模块