目录

1.strlen

1.1易错(例)

1.2模拟实现

1.2.1计数器形式

1.2.2指针-指针形式

1.2.3递归形式

2.strcpy

2.1易错(例)

2.2模拟实现

3.strcat

3.1模拟实现

4.strcmp

4.1 模拟实现

5. 长度受限的字符串长度

6.strstr

7.strtok

7.1 strtok的使用

8.strerror

8.1 strerror的使用

9.其他字符串函数


使用字符串函数要包含头文件#include<string.h>!

1.strlen

  1. 定义:计算数组中‘\0’之前的字符的长度。
  2. 易错:对于strlen大家一定不陌生,但要注意它的返回值是无符号整形(例)。
  3. 模拟实现

1.1易错(例)

#include<stdio.h>
#include<string.h>int main()
{if (strlen("abcd") - strlen("abcdef") > 0){printf(">\n");}else{printf("<=\n");}return 0;
}

  按照本题逻辑,两个strlen函数相减=-3,结果应该是<=。但是,srtlen返回的是无符号整形,两个无符号整形相减还是无符号整型,那么-3将会是一个非常大的整数,程序结果是>。若要进行修改,直接将两个strlen比较大小,或者是进行强制转换。

1.2模拟实现

1.2.1计数器形式

#include<stdio.h>
#include<assert.h>int my_strlen(char *str)
{assert(str!=NULL);int count = 0;while (*str != '\0'){count++;str++;}return count;
}int main()
{char arr[]="abcedf";printf("%d\n", my_strlen(arr));return 0;
}
//结果为6。

1.2.2指针-指针形式

#include<stdio.h>int my_strlen(char* str)
{char* tmp = str;while (*str != '\0'){str++;}return str - tmp;
}int main()
{char arr[] = "abcedf";printf("%d\n", my_strlen(arr));return 0;
}//结果为6。

1.2.3递归形式

#include<stdio.h>
#include<string.h>int my_strlen(const char* str)
{if (*str != NULL){return 1 + my_strlen(++str);}else{return 0;}
}int main()
{char arr[] = "hello,world!";printf("%d\n", my_strlen(arr));return 0;
}
//结果是 12

2.strcpy

  1. 定义:将源数组内容拷贝到目标数组中。
  2. 易错:源字符串必须以‘\0’结束,否则就会导致越界,程序崩溃(例)。
  3. 特别注意!:strcpy会将源字符串的‘\0’拷贝到目标空间,目标空间要足够大,目标空间必须可变。
  4. 模拟实现

2.1易错(例)

#include<stdio.h>int main()
{char arr1[20] = { 0 };char arr2[] = { 'a','b','c' };strcpy(arr1, arr2);return 0;
}

  由上可见,程序崩溃。是因为arr2没有定义大小,strcpy在拷贝时,将内容拷贝完成后没有找到‘\0’,导致程序崩溃 。

2.2模拟实现

#include<stdio.h>
#include<assert.h>char* my_strcpy(char* dest, char* src)
{assert(dest && src);char* ret = dest;while (*dest++ = *src++){;}return ret;
}int main()
{char arr1[20] = { 0 };char arr2[] = "abcdef";printf("%s\n",my_strcpy(arr1,arr2));return 0;
}
//结果是abcdef

3.strcat

  1. 定义:将源字符串的内容追加到目标字符串空间中。从目标空间'\0'处 开始追加。
  2. 易错:自己追加自己会导致死循环。
  3. 特别注意!:源字符串和目标字符串必须以‘\0’结束,目标空间必须足够大,目标空间必须可修改。
  4. 模拟实现

3.1模拟实现

#include<stdio.h>
#include<assert.h>char* my_strcat(char* dest, char* src)
{assert(dest && src);char* ret = dest;//让指针指向目标空间的'\0'处while (*dest){dest++;}//在将源字符串内容拷贝到目标空间while (*dest++ = *src++){;}return ret;
}int main()
{char arr1[20] = "hello";char arr2[] = " world";printf("%s\n", my_strcat(arr1, arr2));return 0;
}
//结果是 hello world

4.strcmp

  1. 定义: 比较两个字符串中对应位置上的字符大小,直到找到不同或'\0'。当str1>str2时,返回>0的数;当str1<str2时,返回<0的数;当str1=str2时,返回0。
  2. 模拟实现

4.1 模拟实现

#include<stdio.h>
#include<assert.h>int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){if (*str1 == '\0'){return 0;}str1++;str2++;}if (*str1 > *str2){return 1;}else{return -1;}
}int main()
{char arr1[] = "abc";char arr2[] = "abcdef";int ret = my_strcmp(arr1, arr2);if (ret > 0)printf(">");else if (ret == 0)printf("=");elseprintf("<");return 0;
}
//结果是<

5. 长度受限的字符串长度

  • strncpy,strncat,strncmp

  • 可以指定长度进行相应的操作,使代码变得相对安全

6.strstr

  1. 定义:在一个字符串中判断另一个字符串是不是该字符串的子串。
  2. 模拟实现
#include<stdio.h>
#include<assert.h>char* my_strstr(const char* str1, const char* str2)
{assert(str1 && str2);const char* s1 = str1;const char* s2 = str2;char* cur = str1;while (*cur){s1 = cur;s2 = str2;while (*s1&&*s2&&(*s1 == *s2)){s1++;s2++;}if (*s2 == '\0'){return cur;}cur++;}return NULL;
}int main()
{char arr1[] = "abcdefgh";char arr2[] = "cdef";char* ret = my_strstr(arr1, arr2);if (ret == NULL){printf("找不到子串\n");}else{printf("%s\n",ret);}return 0;
}
//结果是cdefgh

7.strtok

  1. 定义:字符串切割,给定字符集,对源字符串的内容进行切割。
  2. 特别注意!:strtok找到字符串中的一个标记,用‘\0’结尾,并且返回一个指向这个标记的指针;strtok会改变被操作字符串,建议使用时拷贝将内容到一个新的字符串里,保证源字符串不被修改。;传非NULL指针时,只找第一个标记;传NULL时,从保存好的位置往后找。
  3. strtok的使用

7.1 strtok的使用

#include<stdio.h>
#include<string.h>int main()
{char arr[] = "hello#world*first";char sep[] = "#*";char buf[20];//创建新的字符串char* str = NULL;strcpy(buf, arr);for (str = strtok(buf, sep); str != NULL; str = strtok(NULL, sep)){printf("%s\n",str);}//上面for循环相当于://printf("%s\n",str = strtok(buf, sep));//printf("%s\n",str = strtok(NULL, sep));//printf("%s\n",str = strtok(NULL, sep));//但是这三条语句只对本次arr数组有效,如果arr字符串更长,分割字符集越多就不适用。return 0;
}
//结果是:
//hello
//world
//first

8.strerror

  1. 定义:返回错误码所对应的错误信息。
  2. 特别注意!:使用此函数包含头文件#include<errno.h>;引入全局变量errno(错误码)。
  3. strerror的使用

8.1 strerror的使用

#include<stdio.h>
#include<string.h>
#include<stdlib.h>int main()
{int* p = (int*)malloc(INT_MAX);//INT_MAX是一个非常大的数。if (p == NULL){printf("%s\n",strerror(errno));//与strerror相同功能,只是不需要调用printf打印,并且可以自定义前缀。perror("malloc"); return 1;}return 0;
}
//结果是
//Not enough space
//malloc: Not enough space

9.其他字符串函数

如果参数符合下列条件返回真

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

  • toupper:将字符串中的字符转换成大写
  • tolower:将字符串中的字符转换成小写

C语言——字符串函数(必收藏)相关推荐

  1. C语言字符串函数大全

    转载自http://www.360doc.com/content/08/0723/22/26860_1462024.shtml# C语言字符串函数大全 函数名: stpcpy 功能: 拷贝一个字符串到 ...

  2. 关于c语言字符串函数和一些内存函数的的简介

    关于c语言字符串函数和一些内存函数的的简介 求字符串长度的函数 strlen函数介绍![在这里插入图片描述](https://img-blog.csdnimg.cn/20190301142458376 ...

  3. C语言——字符串函数

    C语言--字符串函数 宗旨:技术的学习是有限的,分享的精神是无限的. 常用字符串操作函数的实现:注释部分你们注意一下,我没加/,加了/就看不到注释了. ************************ ...

  4. c语言字符串英文,C语言字符串函数大全(国外英文资料).doc

    C语言字符串函数大全(国外英文资料) C语言字符串函数大全(国外英文资料) It's all the same -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ...

  5. C语言字符串函数及如何实现这些函数

    C语言字符串函数及如何实现这些函数 ​ 近期在复习C语言字符串相关的知识,在观看了 翁恺 老师的 C语言程序设计 课程后,打算对C语言标准库以及 string.h 内的函数进行整理,并写出自己的实现方 ...

  6. C语言字符串函数(3)strstr,strtok函数的详解

    上一期,我讲解了关于字符串函数中,受限制的字符串函数,有想了解的小伙伴们可以点此链接去看看:C语言字符串函数(2)受限制的字符串函数 那么今天,我来讲一讲标题中这两个函数的作用和使用方法. 目录 一. ...

  7. C语言—字符串函数和内存函数

    文章目录 1.前言 2.字符串函数 2.1 长度不受限制的字符串函数 2.1.1 strlen 内部细节 使用方法 模拟实现 2.1.2 strcmp 内部细节 使用方法 模拟实现 2.1.3 str ...

  8. c语言字符串函数难题,一些常见的C语言字符串操作

    #字符串倒序输出 实现逻辑,通过strlen获取字符串长度,然后通过 len/2 进行交叉赋值,这里需要注意,不需要考虑len是奇数还是偶数的问题. 如果len是奇数,最后一个字符就不需要倒序,如果是 ...

  9. 翁凯c语言字符串函数,C语言基础及指针⑥字符操作

    字符操作 , 是我们写程序时 , 最常用的一种操作 , 例如:字符串截取 , 字符串替换 , 字符串转整数类型等等 , 都是字符操作 , 在java中String类就是二三十个方法 , 还有Strin ...

最新文章

  1. Git叉子实际上是Git克隆吗?
  2. idea项目没法继承httpservlet_SpringBoot项目发布为war
  3. php rpoplpush,Redis Rpoplpush 命令
  4. 【笔记】运筹(上)——Rita_Aloha
  5. 匿名通信攻击技术:主动攻击、被动攻击、单端攻击、端到端攻击
  6. 深度揭秘硅片产业,巨大潜力成就半导体材料之王
  7. [转]看恐怖片能减肥
  8. 中标麒麟 NeoKylin-SDK 里都有哪些库文件
  9. Vue Element-ui el-input无法粘贴问题
  10. (一)大型电商详情页亿级缓存架构简介
  11. 计算机网络基础概念与重要定义汇总
  12. android widget零基础,Android Widget详解(一)
  13. FaE:基于符号知识的适应性和可解释的神经记忆
  14. 关于java用JDBC连接数据库的代码
  15. shell脚本小工具之万能解压和压缩器---实现思路
  16. 数据湖技术Hudi0.10master测试流程
  17. C++11标准模板(STL)- 算法 - 集合操作(在已排序范围上)(std::set_difference)
  18. 中国乳酸菌制品市场销售状况及营销趋势预测报告(2022-2027年)
  19. php修改css文件后缀,css样式表文件的扩展名是什么
  20. 毕业设计 单片机农业土壤酸度检测系统

热门文章

  1. 计算机组织电脑义诊是什么,计算机科学系电脑义诊活动
  2. 为什么字节跳动的前端面试需要那么难的算法题?
  3. 高效过滤器发霉的原因及应对措施
  4. 可持续微电网能源管理
  5. 【LeetCode - 1176】健身计划评估
  6. 桥接模式下的bridged进行网络连接
  7. 远程桌面全屏(快捷键)
  8. 18春学期《计算机应用基础》在线作业1,18春学期《计算机应用基础》在线作业1...
  9. 七夕宠儿,“趣推”背后的黑客增长论
  10. 人事档案管理系统档案项目实施步骤包括哪些内容