C语言-字符串库函数详解(含部分函数的模拟实现)

面试中常常要求写一些基本的库函数,尤其以字符串库函数考的最多,本文汇总了一些常见的字符串库函数。

一般地,使用这些函数,需要包含头文件:

#include <string.h>

一、strlen

函数功能:

求字符串长度的函数。

函数原型:

size_t strlen ( const char * str );

函数说明:

  • 字符串以'\0'作为结束标志,strlen函数返回的是字符串'\0'前面出现的字符个数(不包括'\0')
  • 函数的返回值为size_t,是无符号的

下面通过一个例子解释返回值是无符号这个概念:

#include <stdio.h>
#include <string.h>
int main()
{
	const char* str1 = "abcdef";
	const char* str2 = "bbb";
	if (strlen(str2) - strlen(str1) > 0)
	{
		printf("hello\n");
	}
	else
	{
		printf("hallo\n");
	}
	return 0;
}

结果如下: 

因为strlen函数的返回值是无符号的,所以strlen(str2)-strlen(str1)的结果为3,故输出的结果为hello。

模拟实现:

#include <stdio.h>
#include <assert.h>

int my_strlen(const char *p)
{
	assert(p); //判断指针是否为空
	int count = 0;
	while (*p != '\0') 
	{
		count++;
		p++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	int ret = my_strlen(arr);
	printf("%d\n", ret);
	return 0;
}

二、strcpy

字符串复制函数。

函数功能:

将源字符串拷贝到目标空间中。

函数原型:

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

函数说明:

  • 源字符串必须以'\0'结束
  • 目标空间必须可变并且足够大,从而确保可以存放源字符串
  • 拷贝时,源字符串中的'\0'会被拷贝到目标空间中 

模拟实现:

#include <stdio.h>
#include <assert.h>

char * my_strcpy(char* dest, const char* src)
{
	assert(dest != NULL); //判断指针是否为空
	assert(src != NULL);
	char * ret = dest;
	while (*dest++ = *src++) //拷贝src指向的字符串到dest指向的空间
	{
		;
	}
	//返回目的空间起始位置
	return ret;
}
int main()
{
	char arr1[] = "abcdef"; //目标空间必须足够大
	char arr2[] = "bit";
	my_strcpy(arr1, arr2);
	printf("%s\n",arr1);
	return 0;
}

三、strcat

字符串追加函数。 

函数原型:

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

函数说明:

  • 源字符串必须以'\0'结束
  • 目标空间必须可变并且足够大,从而确保可以存放源字符串
  • 追加时,是从目标空间的'\0'处开始追加

那么,字符串可以给自己 追加吗?答案是 否定的。(可以用strncat实现)

因为:

自己给自己追加时,例如字符串“abcdef”,实际上是abcdef\0,那么在自己给自己追加的时候,把a放到\0的位置,b,c,d,e,f一次放到后面,之后发现\0不在了,已经被改成a了,没有\0(没有到结束位置),没办法停止,故程序会崩溃。

模拟实现: 

#include <stdio.h>
#include <assert.h>

char * my_strcat(char* dest, const char* src)
{
	assert(dest);
	assert(src);
	char* ret = dest;
	while (*dest)  //找到目标字符串中'\0'
	{
		dest++; 
	}
	while (*dest++ = *src++) //追加
	{
		;
	}
	return ret;
}
int main()
{
	//在数组arr1后面追加字符串arr2
	char arr1[10] = "abc";
	char arr2[] = "bcd";
	printf("%s\n", my_strcat(arr1, arr2));
	return 0;
}

四、strcmp

字符串比较函数。

函数说明:

  • 通过比较字串中各个字符的ASCII码,来比较参数str1和str2字符串,比较时考虑字符的大小写
  • 字符串str1大于str2,返回大于0的数字;字符串str1等于str2,返回0;字符串str1小于str2,返回小于0的数字

函数原型:

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

模拟实现:

#include <stdio.h>
#include <assert.h>

int my_strcmp(const char* dest, const char* src)
{
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest == *src)
	{
		if (*dest == '\0')
		{
			return 0; //两个字符串相等
		}
		dest++;
		src++;
	}
	if (*dest > *src)
	{
		return 1;//大于
	}
	else
	{
		return -1;//小于
	}
}
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abd";
	int ret = my_strcmp(arr1, arr2);
	printf("ret=%d\n", ret);
	return 0;
}

 五、strstr

找出str1字符串在str2字符串中第一次出现的位置(不包括str1的’\0’)。

函数原型:

char * strstr ( const char *str2, const char * str1);
  • strstr 返回该位置的指针,如找不到,返回空指针。

 模拟实现:

#include <stdio.h>
#include <assert.h>

char * my_strstr(const char* dest, const char* src)
{
	assert(dest); //判断指针是否为空
	assert(src);
	char* ret1 = dest; 
	char* ret2 = src;
	char* cur = dest;
	if (*src == '\0')
	{
		return dest; //如果需要查找的字符串arr2为空,那么返回字符串arr1的首地址
	}
	while (*dest)
	{
		ret1 = cur;
		ret2 = src;
		while ((*ret1 != '\0') && (*ret2 != '\0') && (*ret1 == *ret2))
		{
			ret1++;
			ret2++;
		}
		if (*dest == "\0")
		{
			return ret1;
		}
		cur++;
	}
	return NULL;
}
int main()
{
	char arr1[] = "abccdef";
	char arr2[] = "cde";
	char * ret = my_strstr(arr1, arr2); //查找arr2字符串是否在arr1字符串中
	if (ret == NULL)
	{
		printf("Ӵ\n");
	}
	else
	{
		printf("%s\n",ret);
	}
	return 0;
}

六、strncpy 

函数原型:

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

函数说明:

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

函数实现:

#include <stdio.h>
#include <string.h>
 
int main()
{
    char arr1[10] = "abcdef";
    char arr2[] = "bit";
    strncpy(arr1, arr2, 6);
    return(0);
}

七、strncat

函数原型:

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

函数功能:

把source所指字符串的前n个字符添加到destination结尾处(覆盖dest结尾处的’\0’),并添加’\0’ 。

函数说明:

  • source和destination所指内存区域不能重叠
  • destination必须有足够的空间来容纳source的字符串

函数实现:

#include <stdio.h>
#include <string.h>
int main ()
{ 
    char str1[20];
    char str2[20]; 
    strcpy (str1,"To be "); 
    strcpy (str2,"or not to be");
    strncat (str1, str2, 6); 
    puts (str1); 
    return 0;
}

八、strncmp

函数原型:

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

函数功能:

比较字符串str1和str2的前num个字符。

函数说明:

如果前num字节完全相等,返回值就为0;在前num字节比较过程中,如果出现*str1与*str2不等,则返回(*str1-*str2)。

函数实现:

#include <stdio.h>
#include <string.h>

int main()
{
	const char *p1 = "abczdef";
	char *p2 = "abcqwer";
	int ret = strncmp(p1, p2, 4);
	printf("%d\n", ret);
	return 0;
}
参与评论 您还未登录,请先 登录 后发表或查看评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

温暖装满阳光

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值