【C语言】常见的字符串函数的使用及模拟实现

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前是C语言学习者
✈️专栏:C语言航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关


前言

  1. ​以下所以库函数的查阅都在cplusplus网站
  2. 以下字符串函数在使用前都要加上#include <string.h>

一、strlen

1.1 strlen函数介绍

功能:计算的是字符串中'\0'前面出现的字符个数(不包含'\0'

【文档描述】

​​​​​在这里插入图片描述

1.2 strlen函数用法

在这里插入图片描述

1.3 strlen函数的注意事项

  1. 参数指向的字符串必须要以'\0'结束,如果不以'\0'结束,求出的长度时随机值
  2. 注意函数的返回值是size_t,是无符号的;因为字符串的长度不可能为负数
    在这里插入图片描述

1.4 strlen函数的模拟实现(三种)

1.4.1 计数法

​​​​在这里插入图片描述

1.4.2 递归法

​详细解析请参考:点我跳转

在这里插入图片描述

1.4.3 指针 - 指针

​详情解析请参考:点我跳转

在这里插入图片描述

二、strcpy

2.1 strcpy函数介绍

功能:字符串拷贝

【文档描述】

在这里插入图片描述

2.2 strcpy函数用法

在这里插入图片描述

2.3 strcpy函数的注意事项

  1. 源字符串必须以‘\0’ 结束
  2. 目标空间必须足够大,以确保能放下源字符串
  3. 目标空间必须可修改,不能用const修饰

2.4 strcpy函数的模拟实现

往期博客:点击跳转

#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* scr)
{
	// 判断指针的有效性
	assert(dest && scr);
	char* res = dest;
	while (*scr != '\0')
	{
		// 赋值
		*dest = *scr;
		dest++;
		scr++;
	}
	// ‘\0’的拷贝
	*dest = *scr;
	// 返回目标空间的起始地址
	return res;
}

int main()
{
	char arr1[20] = "xxxxxxxxxxxxxx";
	char arr2[] = "hello world";;
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

三、strcat

3.1 strcat函数介绍

功能:在字符串后追加字符串

【文档描述】

在这里插入图片描述

3.2 strcat函数用法

在这里插入图片描述

3.3 strcat函数的注意事项

  1. 源字符串必须以‘\0’结束
  2. 目标空间必须要以'\0'结束
  3. 目标空间必须足够大,能容纳源字符串的内容
  4. 保证目标空间可修改,不能加const修饰
  5. strcat不能自己给自己追加
    【解释】
    字符串追加是从目标空间的'\0'开始追加的,追加时会把'\0'覆盖掉,这样字符串就没有结束标志,导致覆盖'\0'后,源字符串没有以‘\0’结尾,导致死循环
    在这里插入图片描述

3.4 strcat函数的模拟实现

注意:strcat的追加是从目标空间的'\0处开始追加的。

  1. 先要找到目标空间的'\0'
  2. 从目标空间的'\0'处开始追加(赋值操作)
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* scr)
{
	assert(dest && scr);
	char* res = dest;
	// 1. 找到目标空间的`\0`
	while (*dest != '\0')
	{
		dest++;
	}
	// 2.在目标空间的'\0'处开始追加
	while (*scr != '\0')
	{
		*dest = *scr;
		dest++;
		scr++;
	}
	// 拷贝'\0'
	*dest = *scr;
	return res;
}

int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";
	my_strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

四、strcmp

4.1 strcmp函数介绍

功能:比较字符串大小(字典序)

【文档描述】

在这里插入图片描述

4.2 strcmp函数用法

在这里插入图片描述

4.3 strcmp函数的模拟实现


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

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		// 当str1和str2所指向为'\0'
		// 说明两个字符串相同
		if (*str1 == '\0')
		{
			// 相同返回0
			return 0;
		}
		str1++;
		str2++;
	}
	// 当str1和str2其中一个不相同来到此处
	return *str1 - *str2;
}

int main()
{
	char arr1[] = "abcd";
	char arr2[] = "abcc";
	int res = my_strcmp(arr1, arr2);
	if (res > 0)
	{
		printf("arr1 > arr2\n");
	}
	else if (res < 0)
	{
		printf("arr1 < arr2\n");
	}
	else
	{
		printf("arr1 == arr2\n");
	}
	return 0;
}

五、strncpy

5.1 strncpy函数介绍

  • strncpystrcpy的功能相同,都是拷贝字符串
  • 不同的是:strncpy可以控制拷贝字符串的个数(注意:'\0'也算个数)

【文档描述】

在这里插入图片描述

5.2 strncpy函数用法

在这里插入图片描述

5.3 strncpy函数的注意事项

  1. 因为受拷贝长度限制,strncpy不会拷贝源字符串的'\0'(看用法),如果想拷贝'\0',需要算上'\0'的个数。而strcpy会自动拷贝源字符的'\0'
  2. 如果源字符串的长度小于num,则拷贝完源字符串之后,它会在目标空间后面自动追加'\0',直到num
    在这里插入图片描述

5.4 strncpy函数的模拟实现

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

char* my_strncpy(char* dest, const char* scr, int n)
{
	assert(dest && scr);
	char* res = dest;
	while (n && *scr != '\0')
	{
		*dest = *scr;
		scr++;
		dest++;
		n--;
	}
	return res;
}

int main()
{
	char arr1[20] = "xxxxxxxxxxxxxxxx";
	char arr2[] = "hello";
	my_strncpy(arr1, arr2, 3);
	printf("%s\n", arr1);
	return 0;
}

六、strncat

6.1 strnact函数介绍

  • strncatstrcat的功能相同,都是字符串追加
  • 不同的是:strncat可以=控制追加的长度

【文档描述】

在这里插入图片描述

6.2 strncat函数用法

在这里插入图片描述

6.3 strncat函数的注意事项

  • strncat在目标字符数组追加完之后会自动补\0',所以它可以自己追加自己
    在这里插入图片描述

6.4 strncat函数的模拟实现

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

char* my_strncat(char* dest, const char* scr, int n)
{
	assert(dest && scr);
	char* res = dest;
	// 1. 找到目标空间的'0'
	while (*dest != '\0')
	{
		dest++;
	}
	// 2. 开始追加
	while (n && *scr != '\0')
	{
		*dest = *scr;
		dest++;
		scr++;
		n--;
	}
	//3.因为追加完之后会自动补\0
	*dest = '\0';
	return res;
}

int main()
{
	char arr1[20] = "hello ";
	my_strncat(arr1, "world", 3);
	printf("%s\n", arr1);
	return 0;
}

七、strncmp

7.1 strncmp函数介绍

  • strcmp的功能相同,都是字符串比较
  • 不同的是:strncmp可以控制字符串比较的长度

在这里插入图片描述

7.2 strncmp函数用法

在这里插入图片描述

7.3 strncmp函数的模拟实现

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

int my_strncmy(const char* str1, const char* str2, int n)
{
	assert(str1 && str2);
	while (n && *str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
		n--;
	}
	return *str1 - *str2;
}

int main()
{
	int input = 0;
	char arr1[] = "abcd";
	char arr2[] = "abcc";
	printf("请输入要比较字符的长度:");
	scanf("%d", &input);

	int res = my_strncmy(arr1, arr2, input);
	if (res == 0)
	{
		printf("前%d个字符相等\n", input);
	}
	else
	{
		printf("前%d个字符不相等\n", input);
	}
	return 0;
}

八、strstr

8.1 strstr函数介绍

功能:从str1中找str2(找子串)

【文档描述】

在这里插入图片描述

8.2 strstr函数用法

在这里插入图片描述

8.3 strstr函数的模拟实现

【分析】

情况1:
在这里插入图片描述
情况2:
在这里插入图片描述
【代码实现】

#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	// 可能存在str2为空字符串
	// 直接返回str1的地址
	if (*str2 == '\0')
	{
		return str1;
	}
	
    //用s1和s2代替str1和str2来遍历
	const char* s1 = str1;
	const char* s2 = str2;
    //p记录str1的位置,用来返回找到的起始地址
	const char* p = str1;
	while (*p)
	{
		s1 = p;
		s2 = str2;
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
		{
			s1++;
			s2++;
		}
        //*s2=\0,说明找到子串了
		if (*s2 == '\0')
		{
			return p;
		}
        //循环中s1和s2不相等,让p++找下一个位置
		p++;
	}
	//当*p = ‘\0’,说明p遍历完整个数组都没找到子串
	return NULL;
}

int main()
{
	char arr1[] = "abbbbcdef";
	char arr2[] = "\0";
	char* res = my_strstr(arr1, arr2);//从arr1中找arr2
	if (res == NULL)
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了:%s\n", res);
	}
	
	return 0;
}

九、strtok

9.1 strtok函数介绍及用法

功能:分割字符串

【文档描述】

在这里插入图片描述

【解析】

  • 如上图,delimiters参数是一个字符串,它是分割符的字符集合
  • str是被切割的字符串,不能用const修饰
  • 函数返回类型是char*
  • strtok的作用:
  1. strtok找到str中的分割符,并把分割符变成\0,再返回一个指向这个标记的起始地址
    在这里插入图片描述
  2. strtok函数的第一个参数不为NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
    strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
    在这里插入图片描述

【完整版】

在这里插入图片描述

十、strerror

10.1 strerror函数介绍

功能:返回错误码所对应的错误信息

  • C语言的库函数在运行的时候,如果发生错误,就会将错误码存在一个全局变量,这个变量是errno
    这些错误码通常是一些数字:1,2,3,4,5…
    在这里插入图片描述

【文档描述】

在这里插入图片描述

10.2 strerror的用途

  • fopen函数简介在这里插入图片描述

【用法实现】

在这里插入图片描述

10.3 类似函数perror

功能:直接打印错误信息,在打印错误信息前,会先打印自定义的信息
在这里插入图片描述

【用法展现】
在这里插入图片描述

  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
### 回答1: C语言中常用的字符串替换函数是`str_replace`,它可以在一个字符串中查找并替换指定的子字符串。下面我将简单地模拟实现一个`str_replace`函数。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> char* str_replace(const char* str, const char* search, const char* replace) { char* result; int search_len = strlen(search); int replace_len = strlen(replace); int count = 0; // 统计需要替换的次数 const char* s = str; while ((s = strstr(s, search)) != NULL) { count++; s += search_len; } // 计算替换后的字符串长度 int result_len = strlen(str) + count * (replace_len - search_len); result = (char*)malloc(result_len + 1); // 开始替换 char* p = result; s = str; while ((s = strstr(s, search)) != NULL) { int n = s - str; strncpy(p, str, n); p += n; strncpy(p, replace, replace_len); p += replace_len; str = s + search_len; } strcpy(p, str); return result; } int main(void) { const char* str = "Hello, world!"; const char* search = "world"; const char* replace = "everyone"; char* result = str_replace(str, search, replace); printf("替换前: %s\n", str); printf("替换后: %s\n", result); free(result); return 0; } ``` 上述代码实现了一个简单的`str_replace`函数。它首先统计了需要替换的次数,并根据替换的次数计算了替换后的字符串长度。然后,它分配了足够的内存空间来存储替换后的字符串,并进行了替换操作。最后,它返回了替换后的字符串。在`main`函数中,我们可以看到如何使用这个函数来替换一个字符串中的子字符串。 需要注意的是,本示例只是对`str_replace`函数的简单模拟实现,实际使用中还需要处理更多的边界情况和错误处理。 ### 回答2: C语言中没有内置的字符串替换函数,但我们可以通过模拟实现一个字符串替换函数。 首先,我们可以定义一个函数,该函数接受三个参数:源字符串、待替换的子字符串、替换后的子字符串函数的返回值是替换完成后的字符串。 接下来,我们可以使用循环来遍历源字符串。在每次循环中,比较源字符串中是否存在待替换的子字符串。如果存在,我们就将替换后的子字符串复制到新的字符串中。如果不存在,我们将源字符串中的当前字符复制到新的字符串中。 最后,返回新的字符串即可。 下面是一个简单的模拟实现示例: ```c #include <stdio.h> #include <string.h> char* stringReplace(char* source, const char* search, const char* replace) { char* result; int i, j, sourceLen, searchLen, replaceLen, count; sourceLen = strlen(source); searchLen = strlen(search); replaceLen = strlen(replace); count = 0; for (i = 0; i < sourceLen; i++) { if (strstr(&source[i], search) == &source[i]) { count++; i += searchLen - 1; } } result = (char*)malloc(sourceLen + count * (replaceLen - searchLen) + 1); i = 0; j = 0; while (source[i]) { if (strstr(&source[i], search) == &source[i]) { strcpy(&result[j], replace); j += replaceLen; i += searchLen; } else result[j++] = source[i++]; } result[j] = '\0'; return result; } int main() { char source[] = "Hello, World!"; const char search[] = "World"; const char replace[] = "C Language"; char* result = stringReplace(source, search, replace); printf("替换后的字符串: %s\n", result); free(result); return 0; } ``` 这是一个简单的模拟实现,实际上字符串替换还涉及到更多复杂的情况和细节,比如大小写敏感、替换次数限制等等。需要根据实际需求进行更进一步的完善。 ### 回答3: C语言字符串替换函数模拟实现的方法有很多,以下是一种可能的实现方式: ```c #include <stdio.h> #include <string.h> void str_replace(char *str, const char *find, const char *replace) { int find_len = strlen(find); int replace_len = strlen(replace); int str_len = strlen(str); char result[100]; int result_len = 0; int i = 0; while (i < str_len) { if (strncmp(&str[i], find, find_len) == 0) { // 找到需要替换的字符串 strncpy(&result[result_len], replace, replace_len); result_len += replace_len; // 跳过被替换的部分 i += find_len; } else { // 将原字符串的字符复制到结果字符串中 result[result_len] = str[i]; result_len++; i++; } } // 将新的结果字符串复制回原字符串中 strncpy(str, result, result_len); str[result_len] = '\0'; } int main() { char str[100] = "Hello, World!"; char find[10] = "World"; char replace[10] = "Alice"; printf("Before replace: %s\n", str); str_replace(str, find, replace); printf("After replace: %s\n", str); } ``` 这个函数的思路是首先计算出原字符串、需要查找的字符串以及替换的字符串的长度。然后以原字符串为基础,通过遍历每个字符的方式,查找需要替换的字符串,然后将替换的字符串复制到结果字符串中,同时跳过原字符串中已经被替换的部分。最后将结果字符串复制回原字符串中,完成字符串的替换。在主函数中,我们可以看到使用这个函数对原始字符串中的特定字符串进行了替换操作。运行程序后,可以输出替换后的字符串

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值