字符串常用操作函数及模拟实现——详解

文章目录

  • 前言
  • 一、字符串常用操作函数介绍:
    • 1.strlen:求字符串长度
    • 2.strcpy:拷贝字符串
    • 3.strcmp:比较字符串的大小
    • 4.strcat:追加字符串内容
    • 5.strstr:判断子串
    • 6.strtok:切割字符串
  • 二、模拟实现
    • 1.strlen:
    • 2.strcpy:
    • 3.strcmp:
    • 4.strcat:
    • 5.strstr:
  • 总结


前言

C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的。字符串通常放在常量字符串中或者字符数组中。字符串常量适用于那些对它不做修改的字符串函数。


一、字符串常用操作函数介绍:

1.strlen:求字符串长度

size_t strlen( const char* str );

  • 字符串已经以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
  • 参数指向的字符串必须要以 ‘\0’ 结束。
  • 注意函数的返回值为size_t,是无符号的( 易错 )
#include 
#include 
int main()
{
	char str[] = "abcdef";
	printf("%d", strlen(str));
	//运行结果为6
	return 0;
}

2.strcpy:拷贝字符串

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

  • 源字符串必须以 ‘\0’ 结束。
  • 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变。
#include 
#include 
int main()
{
	char str1[] = "abcdef";
	char str2[10] = { 0 };
	printf("%s", strcpy(str2, str1));
	//运行结果为abcdef
	return 0;
}

3.strcmp:比较字符串的大小

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

  • 比较的是字符的ASCII码的大小,不是比较字符串长度
  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字
#include 
#include 
int main()
{
	char str1[] = "abcdef";
	char str2[] = "abcq";
	printf("%d", strcmp(str1, str2));
	//运行结果为小于0的数字,表示str1小于str2
	return 0;
}

4.strcat:追加字符串内容

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

  • 源字符串必须以 ‘\0’ 结束。
  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改。
#include 
#include 
int main()
{
	char str1[10] = "abcd";
	char str2[] = "efg";
	printf("%s", strcat(str1, str2));
	//运行结果为abcdefg
	return 0;
}

5.strstr:判断子串

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

  • 返回指向str1中第一个出现的str2的指针,如果str2不是str1。
  • 如果str1中找不到str2的序列,则返回NULL。
#include 
#include 
int main()
{
	char str1[] = "abbbcdef";
	char str2[] = "bbcd";
	printf("%s", strstr(str1, str2));
	//运行结果为bbcdef
	return 0;
}

6.strtok:切割字符串

char * strtok ( char * str, const char * sep );

  • sep参数是个字符串,定义了用作分隔符的字符集合。第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用 ‘\0’ 结尾,返回切割后的左侧字符串首地址,分割完毕或无法分割时,返回NULL;(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。如果字符串中不存在更多的标记,则返回 NULL 指针。
#include 
#include 
int main()
{
	char str1[] = "www.csdn.net";
	char buf[20] = { 0 };
	strcpy(buf, str1);//将str1拷贝到buf临时使用
	char sep[] = ".";
	int i = 0;
	for (i = strtok(buf, sep); i != NULL; i = strtok(NULL, sep))
	{
		printf("%s ", i);//运行结果为www csdn net
	}
	return 0;
}

二、模拟实现

1.strlen:

代码如下(示例):

int my_strlen(const char* p)
{
	assert(p != NULL);//断言,为空指针就会报错
	int count = 0;
	while (*p++ != 0)
	{
		count++;
	}
	return count;
}

2.strcpy:

代码如下(示例):

char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);//断言dest和src有没有空指针,有程序就会报错
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

3.strcmp:

int my_strcmp(char* s1, char* s2)
{
	assert(s1 && s2);
	while (*s1 && *s2 && *s1 == *s2)
	{
		s1++;
		s2++;
	}
	if (*s1 && *s2)
	{	
		return *s1 - *s2;
	}
	else
	{
		return 0;
	}
}

4.strcat:

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

5.strstr:

char* my_strstr(const char* dest, const char* src)
{
	assert(dest && src);
	const char* s1 = dest;
	const char* s2 = src;
	const char* cul = dest;
	while (*cul)
	{
		s1 = cul;
		s2 = src;
		while (*s1 && *s2 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return cul;
		}
		cul++;
	}
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了常用的字符串操作函数的使用和处理字符和字符串的库函数的使用和注意事项,以及模拟实现代码。

你可能感兴趣的:(c语言,c++,数据结构)