文章目录

  • 目录
    • 1.函数介绍
      • (1) 求字符串长度
        • strlen
      • (2)长度不受限制的字符串函数
        • strcpy(拷贝字符串)
        • strcat(追加字符串)
        • strcmp(字符串逐字符比较)
      • (3)长度受限制的字符串函数
        • strncpy
        • strncat
        • strncmp
      • (4)字符串查找
        • strstr(找子串)
        • strtok(分割字符串)
      • (5)错误信息报告
        • strerror
      • (6)字符操作函数
        • 字符分类函数
          • iscntrl
          • isspace
          • isdigit
          • isxdigit
          • islower
          • isupper
          • isalpha
          • isalnum
          • ispunct
          • isgraph
          • isprint
        • 字符转换函数
          • tolower(大写字母转小写)
          • toupper
    • 2.函数模拟实现
      • strlen
      • strcpy
      • strcat
      • strstr
      • strcmp

目录

1.函数介绍

(1) 求字符串长度

strlen

返回值:返回无符号的整形

注意:函数的返回值为size_t,是无符号的( 易错 )

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

(2)长度不受限制的字符串函数

strcpy(拷贝字符串)

返回值:返回目标字符串的起始地址

注意:
①源字符串必须以 ’ \0 ’ 结束
②会将源字符串中的 ’ \0 ’ 拷贝到目标空间
③目标空间必须足够大,以确保能存放源字符串
④目标空间必须可变

char* strcpy(char * destination, const char* source);
#include <stdio.h>int main()
{char arr1[] = "abcdef";char arr2[20] = {0};strcpy(arr2, arr1);printf("%s\n",arr2);return 0;
}

strcat(追加字符串)

头文件:<string.h>

返回值:返回目标字符串的起始地址

在一个字符串的后面追加另一个字符串,原字符串中的 ’ \0 ’ 会被替换掉,追加的字符串的中 ’ \0 ’ 会拷贝过来。

注意:
①源字符串必须以 ‘\0’ 结束
②目标空间必须有足够的大,能容纳下源字符串的内容
③目标空间必须可修改

char * strcat ( char * destination, const char * source );
#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello";char arr2[] = " world";strcat(arr1,arr2);printf("%s\n",arr1);return 0;
}

strcmp(字符串逐字符比较)

头文件:<string.h>

返回值:(标准规定)
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字

注意:逐字符比较,将两个字符串的相同位置进行比较

int strcmp ( const char * str1, const char * str2 );
#include<stdio.h>
#include<string.h>int main()
{char* arr1 = "abcdef";char* arr2 = "abcdef";char* arr3 = "abcd";char* arr4 = "bcde";printf("%d\n", strcmp(arr1,arr2));printf("%d\n", strcmp(arr2, arr3));printf("%d\n", strcmp(arr3, arr4));return 0;
}

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

strncpy

头文件:<string.h>

返回值:返回目标字符串的起始地址

注意:
①拷贝num个字符从源字符串到目标空间
②如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个

char * strncpy ( char * destination, const char * source, size_t num );
#include <stdio.h>
#include <string.h>int main()
{char arr1[] = "abcdef";char arr2[20] = { 0 };strncpy(arr2, arr1, 4);//单位是字节printf("%s\n",arr2);return 0;
}

strncat

头文件:<string.h>

返回值:返回目标字符串的起始地址

char * strncat ( char * destination, const char * source, size_t num );
#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "abcd";char arr2[] = "abc";strncat(arr1, arr2,3);//单位是字节printf("%s\n",arr1);return 0;
}

strncmp

头文件:<string.h>

返回值:(标准规定)
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字

int strncmp ( const char * str1, const char * str2, size_t num );
#include<stdio.h>
#include<string.h>
int main()
{char arr1[] = "hello world";char arr2[] = "abcdef";int ret = strncmp(arr1, arr2, 3);printf("%d", ret);return 0;
}

(4)字符串查找

strstr(找子串)

头文件:<string.h>

返回值:
①成功:返回子串在总串中第一次出现的位置
②失败:返回NULL

char * strstr ( const char *str1, const char * str2);
#include<stdio.h>
#include<string.h>int main()
{char arr1[] = "abcdeqabcdef";char arr2[] = "cdef";char* ret = strstr(arr1, arr2);if (NULL == ret){printf("找不到子串\n");}else {printf("%s\n", ret);}return 0;
}

strtok(分割字符串)

头文件:<string.h>

返回值:strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针

注意:
①sep参数是个字符串,定义了用作分隔符的字符集合
②第一个参数指定一个字符串(原字符串),它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记
③strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容
并且可修改

④strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置
⑤strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标

⑥如果字符串中不存在更多的标记,则返回 NULL 指针

char * strtok ( char * str, const char * sep );
#include <stdio.h>
#include <string.h>int main()
{char arr[] = "abc@def abcde.xyz";char buf[20] = { 0 };strcpy(buf, arr);const char* sep = "@ .";char* str = NULL;for (str = strtok(buf, sep); str != NULL; str = strtok(NULL, sep)){printf("%s\n",str);}return 0;
}

(5)错误信息报告

strerror

头文件:<errno.h> 和 <string.h>

注意:<errno.h>必须包含

返回值:返回错误码,所对应的错误信息

char * strerror ( int errnum );

存在一个全局变量 ,当发现错误信息时会改变该全局变量的值,这个值是会更新的,每个值包含不同的错误信息,例如

#include <stdio.h>
#include <string.h>
#include <errno.h>//必须包含的头文件int main()
{printf("%s\n",strerror(0));printf("%s\n", strerror(1));printf("%s\n", strerror(2));printf("%s\n", strerror(3));return 0;
}


接下来我们看一下该函数的使用

#include <stdio.h>
#include <string.h>
#include <errno.h>//必须包含的头文件
#include <limits.h>int main()
{int* p = (int*)malloc(INT_MAX); //malloc函数是向内存申请空间的函数,后面再讲if (NULL == p)                  //INT_MAX的值是21亿多,申请21亿多字节的内存空间{                             //INT_MAX的使用必须包含头文件<limits.h>printf("%s\n",strerror(errno));}return 0;
}

(6)字符操作函数

字符分类函数

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

函数功能:检查所传的字符是否是控制字符。根据标准 ASCII 字符集,控制字符的 ASCII 编码介于 0x00 (NUL) 和 0x1f (US) 之间,以及 0x7f (DEL),某些平台的特定编译器实现还可以在扩展字符集 (0x7f 以上) 中定义额外的控制字符。

头文件:<ctype.h>

返回值:如果 c 是控制字符(0x 00–0x1F或0x7F ),则iscntrl返回非零值。如果 c 是全控制字符,则 iswcntrl 返回非零值。如果c不满足测试条件,这些例程都返回0。

int iscntrl( int ch );
#include <stdio.h>
#include <ctype.h>int main(){int a = 10;int c = iscntrl('a');printf("%d\n",c);return 0;
}

isspace

函数功能:判断字符c是否为空白符

头文件:<ctype.h>

返回值:当c为空白符时,返回非零值,否则返回零。(空白符指空格、水平制表、垂直制表、换页、回车和换行符。)

int isspace( int c );
#include <stdio.h>
#include <ctype.h>int main(){printf("%d\n",isspace('\n'));return 0;
}

isdigit

函数功能:判断是否为数字 0 ~ 9

头文件:<ctype.h>

返回值:若是十进制数字返回非零值,不是则返回 0

int isdigit(int c);
#include <stdio.h>
#include <ctype.h>int main(){printf("isdigit('0')=%d\n",isdigit('0'));printf("isdigit('9')=%d\n",isdigit('9'));printf("isdigit('a')=%d\n",isdigit('a'));return 0;
}

isxdigit

函数功能:检查所传的字符是否是十六进制数字

头文件:<ctype.h>

返回值:如果 c 是十六进制数字(A–F、A–F或0–9 ),则isxdigit返回非零值。如果 c 是对应于十六进制数字字符的宽字符,则iswxdigit返回非零值。如果 c 不满足测试条件,这些例程都返回 0

int isxdigit(int c);
#include <stdio.h>
#include <ctype.h>int main()
{printf("%d\n", isxdigit(0X32));return 0;
}

islower

函数功能:判断参数 c 是否为小写字母

头文件:<ctype.h>

返回值:若是小写字母返回非零值,否则返回 0

int islower( int c );
#include <stdio.h>
#include <ctype.h>int main()
{printf("%d\n", islower('a'));return 0;
}

isupper

函数功能:判断参数是否为大写字母

头文件:<ctype.h>

返回值:若是大写字母返回非零值,否则返回 0

int isupper( int c );
#include <stdio.h>
#include <ctype.h>int main()
{printf("%d\n", isupper('A'));return 0;
}

isalpha

函数功能:判断参数是否为字母

头文件:<ctype.h>

返回值:若是字母返回非零值,否则返回 0

int isalpha(int c);
#include <stdio.h>
#include <ctype.h>int main()
{printf("%d\n", isalpha('A'));return 0;
}

isalnum

函数功能:判断参数是否为字母或数字

头文件:<ctype.h>

返回值:若是字母或数字返回非零值,否则返回 0

int isalnum(int c);
#include <stdio.h>
#include <ctype.h>int main()
{printf("%d\n", isalnum('A'));return 0;
}

ispunct

函数功能:检查参数是否是标点符号字符

头文件:<ctype.h>

返回值:若是标点符号字符返回非零值,否则返回 0

int ispunct(int c);
#include <stdio.h>
#include <ctype.h>int main()
{printf("%d\n", ispunct(','));return 0;
}

isgraph

函数功能:用来判断一个字符是否为除空格以外的可打印字符

头文件:<ctype.h>

返回值:如果参数所对应的 ASCII 码可打印,且为非空格字符,则返回非 0 值,否则返回 0

int isgraph (int c);
#include <ctype.h> int main()
{ char str[] = "a5 @;"; int i; for(i = 0; str[i] != 0; i++) if(isgraph(str[i])) printf("str[%d] is printable character:%d\n", i, str[i]); return 0;
}

isprint

函数功能:用来判断一个字符是否为打印字符

头文件:<ctype.h>

返回值:如果 c 为可打印字符,将返回非 0 值,否则返回 0

int isprint(int c);
#include <ctype.h>
int main()
{ char str[] = "a5 @;"; int i; for(i = 0; str[i] != 0; i++) if(isprint(str[i])) printf("str[%d] is printable character:%d\n", i, str[i]);
}

字符转换函数

tolower(大写字母转小写)

头文件:<ctype.h>

返回值:返回转变后字母的 ASCII 码值

int tolower (int c);
#include <stdio.h>
#include <ctype.h>int main()
{printf("%c\n", tolower('A'));//printf("%c\n", tolower(97));return 0;
}

toupper

头文件:<ctype.h>

返回值:返回转变后字母的 ASCII 码值

int tolower (int c);
#include <stdio.h>
#include <ctype.h>int main()
{printf("%c\n", toupper('a'));//printf("%c\n", toupper(65));return 0;
}

2.函数模拟实现

strlen

#include <stdio.h>int my_strlen(const char* str)
{int count = 0;while (*str++ != '\0'){count++;}return count;
}int main()
{char arr[] = "You can do it!";int ret = my_strlen(arr);printf("%d",ret);return 0;
}

strcpy

//strcpy函数返回的是目标空间的起始地址
//strcpy函数返回类型是char * ,这样设置是为了实现链式访问#include <stdio.h>
#include <assert.h>               //断言函数头文件char* my_strcpy(char* dest, const char* src)
{assert(dest && src);       // 断言函数//assert(dest != NULL);//assert(src != NULL);char* ret = dest;while (*dest++ = *src++)           //解引用操作符和后置++优先级相同,都是右结合{;}return ret;
}int main()
{char arr1[20] = {0};char* arr2 = "abcedf";printf("%s\n", my_strcpy(arr1, arr2));     //strcpy函数的链式访问return 0;
}

strcat

//strcat函数使用时,源和目标都必须有 '\0'#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;
}

strstr

// 可以了解下KMP算法#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;const char* cur = str1;while (*cur){s1 = cur;s2 = str2;while (*s1 && *s2 && (*s1 == *s2)){s1++;s2++;}if (*s2 == '\0'){return (char*)cur;}cur++;}return NULL;
}int main()
{char arr1[] = "abbbcdef";char arr2[] = "bbc";char* ret = my_strstr(arr1, arr2);if (NULL == ret){printf("找不到子串\n");}else{printf("%s\n", ret);}return 0;
}

strcmp

//strcmp函数比较的不是字符串的长度!!!
//strcmp函数是比较的对应位置上字符的ASCLL码值,若相同则比较下一对,直到比完'\0#include <stdio.h>
#include <assert.h>int my_strcmp(const char* str1, const char* str2)
{while (*str1 == *str2){if (*str1 == '\0')return 0;str1++;str2++;}if (*str1 > *str2)return 1;elsereturn -1;
}int main()
{char arr1[20] = "abcde";char arr2[] = "abcdef";int ret = my_strcmp(arr1, arr2);if (ret > 0)printf(">\n", ret);else if (ret == 0)printf("==\n", ret);elseprintf("<\n",ret);return 0;
}

注:本次学习就暂时结束啦,文章中有错误、不足之处欢迎大佬指正,让我们共同学习,共同进步,欲戴王冠,必承其重,加油!

字符函数和字符串函数相关推荐

  1. 常见的字符函数与字符串函数介绍(1)

    常见的字符函数与字符串函数介绍 前言 C语言中对字符与字符串的处理很是频繁,但是C语言中并没有字符串类型的变量,字符串通常存放在常量字符串或者字符数组中.字符串常量适用于那些对它不做任何修改的字符串函 ...

  2. 字符函数和字符串函数_R中的字符串–函数及其操作

    字符函数和字符串函数 Strings are generally a one-dimensional (1D) arrays that contain single or multiple value ...

  3. 字符函数和字符串函数详解(二)strncpy strncat strncmp strstr strtok(及其模拟实现)

     系列文章目录 字符函数和字符串函数详解(一)strlen strcpy strcat strcmp 字符函数和字符串函数详解(二)strncpy strncat strncmp strstr str ...

  4. 字符函数和字符串函数(上)

    字符函数和字符串函数 前言 一. strlen 1. '\0' 2. 返回值 3. strlen的模拟实现 二. strcpy 1. 源字符串必须以'\0'结束 2. 会将源字符中的'\0'拷贝到目标 ...

  5. 用C语言模拟实现字符函数与字符串函数

    用C语言模拟实现字符函数与字符串函数 strncat.strncpy.atoi 若使用本文相关代码,还请动手点个赞!!! #define _CRT_SECURE_NO_WARNINGS 1 #incl ...

  6. 如何用C语言实现各种字符函数和字符串函数strstr、memcpy、memmove、strlen、strcpy、strcmp、strcat

    用C语言模拟实现字符函数与字符串函数 strstr.memcpy.memmove.strlen.strcpy.strcmp.strcat 若使用本文相关代码,还请动手点个赞!!! #define _C ...

  7. c语言中常用的字符函数以及字符串函数

    文章目录 前言 一.常用字符串函数 1.strlen() 2.strcpy() 3.strcat() 4.strcmp() 5.strstr() 6.memcpy() 6.memmove() 二.qs ...

  8. mysql strcmp s1 s2_MySQL函数基础——字符串函数详解

    昨天,咱们对MySQL的数学函数进行了讲解,今天,咱们再来解析MySQL字符串函数. 字符串函数主要用来处理数据库中的字符串数据,MySQL中字符串函数有:计算字符串长度函数.字符串合并函数.字符串替 ...

  9. oracle函数大全指数运算,Oracle 基础语句 函数大全(字符串函数,数学函数,日期函数,逻辑运算函数......

    ORACLE PL/SQL 字符串函数.数学函数.日期函数 --[字符串函数] --字符串截取substr(字段名,起始点,个数) select Name,substr(Name,2,4),subst ...

  10. java 字符串函数_Java字符串函数– 25+必须知道方法

    java 字符串函数 Java字符串函数 (Java String Functions) Java String class has a lot of functions to manipulate ...

最新文章

  1. 2020 年,人工智能和深度学习未来的五大趋势
  2. Oracle递归操作
  3. 【温故知新】CSS学习笔记(盒子边框介绍)
  4. 怎么查看oracle数据库数据量大小?
  5. python学习笔记一 一变量与运算符
  6. 凯恩帝k1000ti参数设置_KND1000TI系统参数
  7. c++ 2条中线焦点_三角形的中线为何交于一点
  8. java中的命令怎么上移_web系统中上下移动功能的实现
  9. 统计学习(二):统计推断
  10. [Buzz Today]2012.05.10
  11. 【嵌入式系统—ARM指令集】快速了解
  12. ❤️对比PyWinAuto和uiautomation实现微信联系人自动采集❤️
  13. 方舟:生存进化官服和私服区别
  14. shell脚本之AWK-AWK的详细介绍
  15. 操作系统之文件管理(一)
  16. 海贼王热血航线正在连接服务器,航海王热血航线访问频繁进不去解决方法_航海王热血航线访问频繁怎么回事|微安卓...
  17. 关于 人工智能 的思考
  18. S.H.E -《Forever新歌+精选》192Kbps[MP3!]
  19. 「Gradle学习笔记」一、构建工具
  20. Excel柱状图,饼图,折线图

热门文章

  1. python实战笔记之(8):下载知乎视频
  2. 电子厂计算机常用英语,电子厂常用英语
  3. 零基础学java(6)——面向对象的基本特征
  4. 浅析专题中的构图之美
  5. 滁州学院元旦晚会计算机,滁州学院机械学院2017元旦晚会精彩上演
  6. EditText禁止输入表情
  7. CSS3 will-change提高页面动画等渲染性能
  8. HTML中字体和字体图标的应用
  9. 简单Java的商品模块功能
  10. 关于论文组会的一些思考(其一)