文章目录:

  • 1.求字符串长度
    • 1.1 strlen库函数
      • 1.1.1函数讲解
      • 1.1.2 strlen模拟实现
  • 2.长度不受限制的字符串
    • 2.1 strcpy库函数
      • 2.1.1函数讲解
      • 2.1.2 strcpy模拟实现
    • 2.2 strcat库函数
      • 2.2.1函数讲解
      • 2.2.2 strcat模拟实现
    • 2.3 strcmp库函数
      • 2.3.1函数讲解
      • 2.3.2 strcmp模拟实现
  • 3.长度受限制的字符串函数
    • 3.1 strncpy库函数
      • 3.1.1函数讲解
      • 3.1.2 strncpy模拟实现
    • 3.2 strncat库函数
      • 3.2.1函数讲解
      • 3.2.2 strncat模拟实现
    • 3.3 strncmp库函数
      • 3.3.1函数讲解
      • 3.3.2 strncmp模拟实现
  • 4.字符串查找函数
    • 4.1 srtstr库函数
      • 4.1.1函数讲解
      • 4.1.2 strstr模拟实现
    • 4.2 strtok库函数
      • 4.2.1函数讲解
  • 5.错误信息报告函数
    • 5.1 strerror库函数
      • 5.1.1函数讲解
  • 6.字符操作函数
  • 7.内存操作函数
    • 7.1 memcpy库函数
      • 7.1.1函数讲解
      • 7.1.2 memcpy模拟实现
    • 7.2 memmove库函数
      • 7.2.1函数讲解
      • 7.2.2 memmove模拟实现
    • 7.3 memcmp库函数
      • 7.3.1函数讲解
    • 7.4 memset库函数
      • 7.4.1函数讲解

1.求字符串长度

1.1 strlen库函数

size_t strlen ( const char * str );

1.1.1函数讲解

1.函数功能:统计字符串中\0之前出现的字符个数
2.字符串已经将 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包
含 ‘\0’ )。
3.参数指向的字符串必须要以 ‘\0’ 结束。
4.注意函数的返回值为size_t,是无符号的
5.头文件#include<string.h>

代码运用:

#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "cjcwqr";printf("%d", strlen(arr));//6return 0;
}

1.1.2 strlen模拟实现

//strlen模拟实现
#include<stdio.h>
#include<assert.h>
int my_strlen(const char* str)
{assert(str);const char* start = str;const char* end = str;while (*end != '\0'){end++;}return end - start;
}int main()
{char arr[] = "cjcwqr";printf("%d", my_strlen(arr));//6return 0;
}

2.长度不受限制的字符串

2.1 strcpy库函数

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

2.1.1函数讲解

1.函数功能:将一个字符串中\0之前的内容拷贝到另一个字符串中(替换)
2.源字符串必须以 ‘\0’ 结束。
3.会将源字符串中的 ‘\0’ 拷贝到目标空间。
4.目标空间必须足够大,以确保能存放源字符串。
5.目标空间必须可变.
6.头文件#include<string.h>

代码运用:

#include<stdio.h>
#include<string.h>
int main()
{char arr1[20] = "happy";char arr2[] = "cjcwqr";strcpy(arr1, arr2);printf("%s\n",arr1);//cjcwqrreturn 0;
}

2.1.2 strcpy模拟实现

//strcpy模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, char* src)
{assert(dest);assert(src);char* start = dest;while (*dest++ = *src++){;}return start;
}
int main()
{char arr1[20] = "happy";char arr2[] = "cjcwqr";printf("%s\n", my_strcpy(arr1, arr2));//cjcwqrreturn 0;
}

2.2 strcat库函数

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

2.2.1函数讲解

1.函数功能:在一个字符串后面连接另一个字符串
2.源字符串必须以 ‘\0’ 结束。
3.目标空间必须有足够的大,能容纳下源字符串的内容。
4.目标空间必须可修改。
5.可以实现字符串自己给自己追加(有风险)
6.头文件#include<string.h>

代码运用:

#include<stdio.h>
#include<string.h>
int main()
{char arr1[20] = "cjc";char arr2[] = "wqr";strcat(arr1, arr2);printf("%s",arr1);//cjcwqrreturn 0;
}

2.2.2 strcat模拟实现

//strcat模拟实现
#include<stdio.h>
char* my_strcat(char* dest, const char* src)
{//1.找到目标空间中的\0char* start = dest;while (*dest){dest++;}//2.拷贝源头数据\0之后的空间while (*dest++ = *src++){;}return start;
}int main()
{char arr1[20] = "cjc";char arr2[] = "wqr";my_strcat(arr1, arr2);printf("%s",arr1);//cjcwqrreturn 0;
}

2.3 strcmp库函数

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

2.3.1函数讲解

1.函数功能:比较两个字符串的值(ASCII值)
2.从左到右一个一个字符依次比较,遇到’\0’停止,比较的是字符的ASCII值
3.返回值:相等返回0,小于返回大于0的数字,大于返回小于0的数字
4.头文件#include<string.h>

代码运用

#include<stdio.h>
#include<string.h>
int main()
{//char arr1[] = "cjcwqr";//char arr2[] = "czc";//-1//char arr1[] = "cjcwqr";//char arr2[] = "cjc";//1//char arr1[] = "cjcwqr";//char arr2[] = "cjcwqr";//0char arr1[] = { 'w','q','r' };char arr2[] = { 'w','q','r' };//遇到\0停止无法比较int ret = strcmp(arr1, arr2);printf("%d\n", ret);return 0;
}

2.3.2 strcmp模拟实现

//模拟实现strcmp
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* s1, const char* s2)
{assert(s1 && s2);while (*s1 == *s2){if (*s1 == '\0'){return 0;}s1++;s2++;}return *s1 - *s2;
}int main()
{//char arr1[] = "cjcwqr";//char arr2[] = "czc";//arr1<arr2//char arr1[] = "cjcwqr";//char arr2[] = "cjc";//arr1>arr2char arr1[] = "cjcwqr";char arr2[] = "cjcwqr";//arr1==arr2int ret = my_strcmp(arr1, arr2);if (ret > 0){printf("arr1>arr2\n");}else if(ret<0){printf("arr1<arr2\n");}else{printf("arr1==arr2\n");}return 0;
}

3.长度受限制的字符串函数

3.1 strncpy库函数

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

3.1.1函数讲解

1.函数功能:拷贝num个字符从源字符串到目标空间。
2.如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
3.不会将源字符串中的 ‘\0’ 拷贝到目标空间,其余要点同strcpy

代码运用:

#include<stdio.h>
#include<string.h>
int main()
{char arr1[20] = "cjchappy";char arr2[] = "wqr";//strncpy(arr1, arr2, 3);//wqrhappy//printf("%s", arr1);strncpy(arr1, arr2, 5);printf("%s", arr1);//wqr,因为会追加两个0,读字符串遇到0停止往后读return 0;
}

3.1.2 strncpy模拟实现

//strncpy模拟实现
#include<stdio.h>
char* my_strncpy(char* dest, const char* src, size_t count)
{char* start = dest;while (count != '0' && (*dest++ = *src++) != '\0'){count--;}if (count){while (--count){*dest++ = '\0';}}return start;
}int main()
{char arr1[20] = "cjchappy";char arr2[] = "wqr";my_strncpy(arr1, arr2, 3);//wqrprintf("%s", arr1);//my_strncpy(arr1, arr2, 5);//printf("%s", arr1);//wqr,因为会追加两个0,读字符串遇到0停止往后读return 0;
}

3.2 strncat库函数

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

3.2.1函数讲解

可以实现字符串自己给自己追加
其余要点同strncat

代码运用:

#include<stdio.h>
#include<string.h>
int main()
{char arr1[20] = "cjc";char arr2[] = "wqrhappy";//strncat(arr1, arr2, 3);//printf("%s", arr1);//cjcwqrstrncat(arr1, arr1, 3);printf("%s", arr1);//cjccjcreturn 0;
}

3.2.2 strncat模拟实现

//strncat模拟实现
#include<stdio.h>
char* my_strncat(char* front, char* back, size_t count)
{char* start = front;while (*front++){;}front--;while (count--){if ((*front++ = *back++) == 0){return start;}}*front = '\0';return start;
}int main()
{char arr1[20] = "cjc";char arr2[] = "wqrhappy";my_strncat(arr1, arr2, 3);printf("%s", arr1);//cjcwqr//my_strncat(arr1, arr1, 3);//printf("%s", arr1);//cjccjcreturn 0;
}

3.3 strncmp库函数

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

3.3.1函数讲解

要点同strcmp

代码运用:

#include<stdio.h>
#include<string.h>
int main()
{//int ret = strncmp("cjcwqr", "cjc", 3);//printf("%d\n", ret);//0//int ret = strncmp("cjcwqr", "cjc", 4);//printf("%d\n", ret);//1int ret = strncmp("cjcwqr", "czc", 2);printf("%d\n", ret);//-1return 0;
}

3.3.2 strncmp模拟实现

//strncmp模拟实现
#include<stdio.h>
#include<assert.h>
int my_strncmp(const char* s1, const char* s2, size_t num)
{assert(s1 && s2);if (!num)return 0;while (--num && *s1 && (*s1 == *s2)){s1++;s2++;}return *s1 - *s2;
}int main()
{int ret = my_strncmp("cjcwqr", "cjc", 3);printf("%d\n", ret);//0//int ret = my_strncmp("cjcwqr", "cjc", 4);//printf("%d\n", ret);//119//int ret = my_strncmp("cjcwqr", "czc", 2);//printf("%d\n", ret);//-16return 0;
}

4.字符串查找函数

4.1 srtstr库函数

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

4.1.1函数讲解

1.函数功能: 判断在一个字符串中另一个字符串是否存在
2.返回值:存在,返回子串第一次出现的位置的地址;不存在,返回NULL
3.头文件:#include<string.h>

函数运用:

#include<stdio.h>
#include<string.h>
int main()
{char arr1[] = "cjcwqrcjcwqr";char arr2[] = "wqr";char* p = strstr(arr1, arr2);//输出:wqrcjcwqrchar arr3[] = "czc";//char* p = strstr(arr1, arr3);//输出:不存在if (p == NULL){printf("不存在\n");}else{printf("%s\n", p);}return 0;
}

4.1.2 strstr模拟实现

//strstr模拟实现
#include<stdio.h>
char* my_strstr(const char* str1, const char* str2)
{const char* s1 = str1;const char* s2 = str2;const char* p = str1;if (*str2 == '\0')//子串是空字符串{return str1;}while (*p){s1 = p;s2 = str2;while (*s1 != '\0' && s2 != '\0' && (*s1 == *s2)){s1++;s2++;}if (*s2 == '\0'){return (char*)p;//找到子串了}p++;}return NULL;//找不到子串
}
int main()
{char arr1[] = "cjcwqrcjcwqr";char arr2[] = "wqr";char* p = my_strstr(arr1, arr2);//输出:wqrcjcwqrchar arr3[] = "czc";//输出:不存在//char* p = my_strstr(arr1, arr3);if (p == NULL){printf("不存在\n");}else{printf("%s\n", p);}return 0;
}

4.2 strtok库函数

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

4.2.1函数讲解

1.函数功能:根据标识符分割字符串
2.sep参数是个字符串,定义了用作分隔符的字符集合
3.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标
记。
4.strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容
并且可修改。)
5.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串
中的位置。
6.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标
记。
7.如果字符串中不存在更多的标记,则返回 NULL 指针。
8.头文件:#include <string.h>

函数运用:

#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "cjc@wqr.com";char buf[200] = { 0 };strcpy(buf, arr);//strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改const char* p = "@.";char* str = NULL;for (str = strtok(buf, p); str != NULL; str = strtok(NULL, p)){printf("%s\n", str);}       return 0;
}
//输出cjc
//    wqr
//    com

5.错误信息报告函数

5.1 strerror库函数

char * strerror ( int errnum );

5.1.1函数讲解

1.函数功能:返回错误码,所对应的错误信息。
2.头文件:#include<string.h>

函数运用:

6.字符操作函数

函数 如果他的参数符合下列条件就返回真
iscntrl 任何控制字符
isspace 空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’
isdigit 十进制数字 0~9
isxdigit 十六进制数字,包括所有十进制数字,小写字母a ~f,大写字母A ~F
islower 小写字母a~z
isupper 大写字母A~Z
isalpha 字母az或AZ
isalnum 字母或者数字,az,AZ,0~9
ispunct 标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph 任何图形字符
isprint 任何可打印字符,包括图形字符和空白字符

字符转换运用:

#include<stdio.h>
#include <ctype.h>
int main()
{char arr[] = "Are you ok?";char* p = arr;while (*p){if (islower(*p)){*p = toupper(*p);}p++;}printf("%s\n", arr);return 0;
}
//输出 ARE YOU OK?

7.内存操作函数

7.1 memcpy库函数

void * memcpy ( void * destination, const void * source, size_t num );

7.1.1函数讲解

1.函数功能:从source的位置开始向后复制num个字节的数据到destination的内存位置。
2.这个函数在遇到 ‘\0’ 的时候并不会停下来。
3.如果source和destination有任何的重叠,复制的结果都是未定义的。
4.头文件:#include<string.h>

函数代码运用:

7.1.2 memcpy模拟实现

//memcpy模拟实现
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, void* src, size_t num)
{void* ret = dest;assert(dest && src);while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };my_memcpy(arr2, arr1, 16);//从arr1复制16个字节到arr2,即为1,2,3,4int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}
//输出:1 2 3 4 0 0 0 0 0 0

7.2 memmove库函数

void * memmove ( void * destination, const void * source, size_t num );

7.2.1函数讲解

1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
2.如果源空间和目标空间出现重叠,就得使用memmove函数处理。
3.头文件:#include<string.h>

代码运用:

#include<stdio.h>
#include<string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1 + 2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}
//原数组:1 2 3 4 5 6 7 8 9 10
//           1 2 3 4 5         (从下标2开始覆盖原数组前20个字节,即1 2 3 4 5覆盖3 4 5 6 7)
//       1 2 1 2 3 4 5 8 9 10  (最终输出)

7.2.2 memmove模拟实现

//memmove模拟实现
#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, void* src, size_t num)
{void* ret = dest;assert(dest && src);//从前往后覆盖if (dest < src){while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}//从后往前覆盖else{while (num--){*((char*)dest + num) = *((char*)src + num);}}return ret;
}int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr1 + 2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}
//输出 1 2 1 2 3 4 5 8 9 10

7.3 memcmp库函数

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

7.3.1函数讲解

1.函数功能:比较从ptr1和ptr2指针开始的num个字节
2.和strncpy很相似,但是memcpy针对各种类型,strncpy只能比较char类型的。
3.返回值:ptr1的字符ASCII码值大于ptr2就返回大于0的值,等于返回0,小于则返回小于0的值
4.头文件:#include<string.h>

代码运用:

int main()
{int arr1[] = { 1,2,3,0,5 };//01 00 00 00 02 00 00 00 03 00 00 00 00 00 00 00 ...int arr2[] = { 1,2,3,4,0 };//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 ...int ret = memcmp(arr1, arr2, 13);//比较arr1和arr2的前13个字节的值printf("%d\n", ret);//arr1<arr1,输出-1return 0;
}

7.4 memset库函数

void * memset ( void * ptr, int value, size_t num );

7.4.1函数讲解

1.函数功能:把ptr指针指向的内容后的num个字节全部改为value值
2.头文件:#include<string.h>

代码运用:
好了今天的内容到这儿就结束了,对友友们有帮助的话,不妨三连加关注支持一下,后期会持续更新C语言干货!

C语言字符串+内存库函数详解相关推荐

  1. C语言动态内存分配详解

    文章目录 前言 一.为什么存在动态内存分配 1.已掌握的内存开辟方式 2.上述开辟空间方式的特点 3.为什么存在动态内存分配 二.动态内存函数的介绍 1.malloc 2.free 3.calloc ...

  2. C语言动态内存开辟详解(malloc,calloc,realloc,free,柔型数组)

    目录 一.概述 二.相关库函数的使用 1.malloc 2.calloc malloc vs. calloc 异同 3.free的使用 4.realloc 三.易错点 四.C\C++程序的内存开辟规则 ...

  3. C语言字符串string.h详解

    本文已整合到C语言标准库深度解读 文章目录 查询函数 比较函数 复制和追加 本地函数 为了看上去规整简洁,令 #define cSTR const char *str #define vSTR con ...

  4. C语言用函数字符串的查找,字符串查找函数,C语言字符串查找函数详解

    在对 C 语言的编程实践中,字符串查找是最频繁的字符串操作之一,本节就对常用的字符串查找函数做一个简单的总结. 使用 strchr 与 strrchr 函数查找单个字符如果需要对字符串中的单个字符进行 ...

  5. 易语言读写内存操作详解

    1.函数原型: BOOL ReadProcessMemory( HANDLE hProcess, PVOID pvAddressRemote, PVOID pvBufferLocal, DWORD d ...

  6. C语言字符串函数的详解

    一.字符串具体有哪些 求字符串的长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数介绍 strncpy strncat strncmp 字符 ...

  7. java文档注释定界符_c语言的注释定界符详解

    c语言的注释定界符详解 c语言的注释定界符是什么 1.最早期的C语言注释是:/* */ 2.后来又增加的行注释:// 其中/**/是多行注释,//是单行注释. 需要注意的是:C 语言的注释并不是可以出 ...

  8. C语言字符串库函数详解模拟实现(strlen、strcpy、strcat、strcmp)+字符操作函数+字符转换函数

    字符串库函数详解 一.无字符串长度限制的字符串函数 1. strlen 计算字符串长度函数 2. strcpy 字符串拷贝函数 3. strcat 字符串追加函数 4. strcmp 字符串比较函数 ...

  9. c语言printf函数中的格式控制字符串,C++_C语言格式化输入输出函数详解,一:格式输出函数printf() 1 - phpStudy...

    C语言格式化输入输出函数详解 一:格式输出函数printf() 1.调用形式一般为:printf("格式化控制字符串",输出表列): 2.格式化控制字符串用于指定输出格式,它有三种 ...

  10. 【C】C语言格式输入函数scanf()详解

    参考了:C语言格式输入函数scanf()详解 总述 scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中. scanf函数的一般形式 scanf函数是一个标准库函数,它 ...

最新文章

  1. 最新NLP架构的直观解释:多任务学习– ERNIE 2.0(附链接)| CSDN博文精选
  2. Android流量统计TrafficStats类
  3. mysql逗号分隔正则查询_正则表达式在逗号分隔的列表中查找字符串和下一个字符-MySQL?...
  4. java enum in class_Java 8需要一个转换,而Java 7没有 – enum.getClass/getDeclaringClass
  5. 基于JAVA+SpringMVC+MYSQL的在线考试系统
  6. R语言实现K最近邻算法(KNN)
  7. python glob模块
  8. 思维挑战6:奔跑的小人
  9. 2020年个人年终总结
  10. Facebook、Twitter、LinkedIn分享按钮总结
  11. 继勒索病毒“永恒之蓝”445端口被封之后,在公网实现smb文件共享
  12. workbench动力学周炬_《ANSYS WORKBENCH有限元分析实例详解(动力学)》【价格 目录 书评 正版】_中国图书网...
  13. 解决电脑端微信浏览器不支持vue、axios等问题
  14. Maple学习笔记——数学计算与数据处理
  15. HttpWebRequest.Create
  16. ChatGPT:开启智能对话的未来
  17. 397高校毕业设计选题
  18. 【文本生成】评价指标:事实一致性Evaluating the Factual Consistency of Abstractive Text Summarization
  19. 水库雨水情测报和大坝安全监测设施 小型水库除险加固安全监测设施
  20. python100到200的素数_python 100~200的素数和

热门文章

  1. cmake 返回上层目录
  2. Python中的爬虫
  3. 人工智能数学基础8:两个重要极限及夹逼定理
  4. vsto 安装成功后打开office word不加载
  5. 手机无线网络为啥无法连接服务器,手机wifi打不开及手机WiFi连接上但不能上网,怎么办?...
  6. [渝粤教育] 中国地质大学 大学语文 复习题 (2)
  7. [USACO19FEB]Mowing Mischief
  8. thinkPad电脑无人操作时休眠设置
  9. 什么是智能家电?消费者不知判定标准
  10. HTML页面如何引入其他HTML页面