欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > c语言字符串函数详解(全)

c语言字符串函数详解(全)

2025/6/25 18:52:05 来源:https://blog.csdn.net/weixin_65752158/article/details/139801589  浏览:    关键词:c语言字符串函数详解(全)

 字符串函数

1.strlen函数  求字符串长度的

3b35eb199cd0430fb3e8e7e5fc335220.png

a993220bfbba4ccfaaeb3d7b8312ccd7.png

11c1f0c3b33b45d39bb41a15534d03c1.png

836c4988d90e4dd8bedf539b4c23d1c9.png

bb63e47ff54443b8a33483bf292cc1e5.png

b62d5280c5344ea695f8212cf04e5e66.png

//求字符串长度
int my_strlen(char* str)
{int count = 0;while (*str != '\0'){count++;*str++;}return count;
}
int main()
{char arr[] = "abcdef";int red = my_strlen(arr);printf("%d\n", red);return 0;
}

2.  strcpy  字符串拷贝

78838a2286914b4e942f6eaa8c7ffbfb.png

992326c6adff41d6aea4c3e0640f734c.png7b3590430b6a424a8e263478e3144d0a.png

fadcde6fe1934434946c043eb97f5c27.png

846e16bff81045c7aae0bd5b2af8db6a.png

//求字符串拷贝
char* my_strcpy(char* arr2, char* arr1)
{char *red = arr2;while (*arr2++ = *arr1++)//'\0'赋给arr2时arr2为假就停止循环{;}return red;}
int main()
{char arr1[] = { "abc" };char arr2[40] = { 0 };my_strcpy(arr2, arr1);printf("%s", arr2);return 0;
}

3、strcat  字符串连接

56f2507cb157429b8318b711907fae7e.png

9b6bce9f8621485d9b7068f6eb7a4406.png

3e7cfbfd28a84bcfb69d8e47ca486cf7.png

d8aed949c9d643f9a53a90ae1d6ec1d0.png

先找到需要连接的字符串末端'\0'处,然后拷贝

a20eae6b904046df82ddb744638a3ebb.png

拷贝是在\0这里进行拷贝。

//字符串连接
char* my_strcat(char* arr1, char* arr2)
{char* ret=arr1;while (*arr1 != '\0'){arr1++;}while (*arr1++ = *arr2++){;}return ret;
}
int main()
{char arr1[40] = { "hello" };char arr2[] = "bit";my_strcat(arr1, arr2);printf("%s", arr1);return 0;
}

4.strcmp-字符串比较函数。

3fef40e824594c87b6a73573d208211a.png

因为这个是二个不同的数组名,他们比较的肯定不一样,因为首元素地址不同,所以比较就不相同,这里比较的不是内容,是地址。

e5fd2abddb2141e7b809b53ed3dbec39.png

比较二个字符串应该用strcmp函数

f619af0b07374aebb816feac424e4e84.png

61cf29edf6754afcb11e6fcba6e7ed27.png

//求字符串比较函数
int my_strcmp(char* arr1, char* arr2)
{while (*arr1 == *arr2){if (*arr1 == '\0'){return 0;//相等arr1++;arr2++;}return (*arr1 - *arr2);}
}
int main()
{char arr1[] = "abc";char arr2[]="bcd";int ret = my_strcmp(arr1, arr2);if (ret > 0){printf(">0\n");}else if (ret<0){printf("<0\n");}else{printf("==0\n");}return 0;
}

eead6e8f7cb7448e98ffa242afa5874b.png

这个代码关键就是*arr1和*arr2相同的情况下遇到'\0时应该终止循环,返回相等。

232f2bd27ba74a6f9de66e2bceec748d.png

1.strncpy  -字符串拷贝。

70d1cb5b5bf548bdae99d135dfbe0d63.png

2.strncat(字符串连接)

e017ba5774d94e48b51aff8597a1f176.png

加了n就是加了限定的条件,比如strncmp

3.strstr -----查找子串

41b2d5f94cc14ca6aae50816b105bdc2.png

如果找到了子串就返回第一个字符的地址,也就是b字符的地址,因为是从b字符开始才算找到子串。找不到返回空指针,NULL

//模拟实现一下strstr
char* my_strstr(char* arr1, char* arr2)
{char* s1 = arr1;char* s2 = arr2;char* p = arr1;while (*p){s1 = p;s2 = arr2;while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2){s1++;s2++;}if (*s2 =='\0'){return p;}p++;}return NULL;
}
int main()
{char arr1[] = "www.h";char arr2[] = "w.h";char* ret = my_strstr(arr1, arr2);if (ret == NULL){printf("子串不存在\n");}else{printf("%s\n", ret);}return 0;
}

95ed4b4084524f92905c93d182223639.png

673f65abf03f48babe13a03b7176eebd.png


strtok函数

427bd67eb84b42ffbe84b538c24732f9.png
bb75a672aae7437c8ac37c241c0694ae.png

c66490507e684190bc5745b4bbc46682.png

//strcok()函数
#include <string.h>
int main()
{char arr1[] = "zhangsan@1666.com";char arr2[30] = { 0 };strcpy(arr2, arr1); const char* p = "@.";char* s2 = NULL;// 初始化只是初始话一次for (s2= strtok(arr2, p); s2 != NULL; s2=strtok(NULL, p)){printf("%s\n", s2);}return 0;
}

3. strerror?函数的使⽤?

6a02b68072014643a83379769f7ee5b6.png

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。?
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明
的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动
的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应
的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是
有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。?

68625cc7fdd544cb90bf83b4b9c7ea78.png


#include <errno.h>
int main()
{for (int i = 0; i < 10; i++){printf("%s\n", strerror(i));}return 0;
}

19808a9d82e242169f05ae92896d359b.png

96ef13a63dc6424a93a5343320385c65.png

4.memcpy  -内存拷贝

851d3c7f23ba44ddbe3a74216e71083b.png

4a8c58afac3f49c490ccf88f27e6e512.png

81e67cee758545f7b500564a0fc2c3d1.png


模拟实现memcpy函数
void* my_memcpy(void* dest, void* src,size_t num)
{char* ret = dest;while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;}
int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };my_memcpy(arr1 + 2, arr1, 20);for (int i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}
//不能解决重叠问题
重叠问题

6f7550548a08479688237b95f5efec43.png

3ee32f320cde4731967af3d4aab33722.png

memmove使⽤和模拟实现

3947e8552f0c4f6d86d4a22cd8f726f9.png

int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1 + 2, arr1, 20);for (int i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}
//不能解决重叠问题

2ab73a7200d84ac9be06e4edecfe743a.png

memset函数的使⽤

f056fe03e4854b07b32afd3431751ace.png

090ecb45d37548b2b29ca44a67c830bc.png

//memset内存设置
int main()
{char arr[] = "hello bite";memset(arr, 'x', 5);//以字节为单位来设置的printf("%s\n", arr);return 0;
}

 memcmp函数的使⽤

37593ba8b8924f69974f5e6c3ddb480d.png



版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词