字符函数和字符串函数
文章目录
- 目录
- 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)
常见的字符函数与字符串函数介绍 前言 C语言中对字符与字符串的处理很是频繁,但是C语言中并没有字符串类型的变量,字符串通常存放在常量字符串或者字符数组中.字符串常量适用于那些对它不做任何修改的字符串函 ...
- 字符函数和字符串函数_R中的字符串–函数及其操作
字符函数和字符串函数 Strings are generally a one-dimensional (1D) arrays that contain single or multiple value ...
- 字符函数和字符串函数详解(二)strncpy strncat strncmp strstr strtok(及其模拟实现)
系列文章目录 字符函数和字符串函数详解(一)strlen strcpy strcat strcmp 字符函数和字符串函数详解(二)strncpy strncat strncmp strstr str ...
- 字符函数和字符串函数(上)
字符函数和字符串函数 前言 一. strlen 1. '\0' 2. 返回值 3. strlen的模拟实现 二. strcpy 1. 源字符串必须以'\0'结束 2. 会将源字符中的'\0'拷贝到目标 ...
- 用C语言模拟实现字符函数与字符串函数
用C语言模拟实现字符函数与字符串函数 strncat.strncpy.atoi 若使用本文相关代码,还请动手点个赞!!! #define _CRT_SECURE_NO_WARNINGS 1 #incl ...
- 如何用C语言实现各种字符函数和字符串函数strstr、memcpy、memmove、strlen、strcpy、strcmp、strcat
用C语言模拟实现字符函数与字符串函数 strstr.memcpy.memmove.strlen.strcpy.strcmp.strcat 若使用本文相关代码,还请动手点个赞!!! #define _C ...
- c语言中常用的字符函数以及字符串函数
文章目录 前言 一.常用字符串函数 1.strlen() 2.strcpy() 3.strcat() 4.strcmp() 5.strstr() 6.memcpy() 6.memmove() 二.qs ...
- mysql strcmp s1 s2_MySQL函数基础——字符串函数详解
昨天,咱们对MySQL的数学函数进行了讲解,今天,咱们再来解析MySQL字符串函数. 字符串函数主要用来处理数据库中的字符串数据,MySQL中字符串函数有:计算字符串长度函数.字符串合并函数.字符串替 ...
- oracle函数大全指数运算,Oracle 基础语句 函数大全(字符串函数,数学函数,日期函数,逻辑运算函数......
ORACLE PL/SQL 字符串函数.数学函数.日期函数 --[字符串函数] --字符串截取substr(字段名,起始点,个数) select Name,substr(Name,2,4),subst ...
- java 字符串函数_Java字符串函数– 25+必须知道方法
java 字符串函数 Java字符串函数 (Java String Functions) Java String class has a lot of functions to manipulate ...
最新文章
- 2020 年,人工智能和深度学习未来的五大趋势
- Oracle递归操作
- 【温故知新】CSS学习笔记(盒子边框介绍)
- 怎么查看oracle数据库数据量大小?
- python学习笔记一 一变量与运算符
- 凯恩帝k1000ti参数设置_KND1000TI系统参数
- c++ 2条中线焦点_三角形的中线为何交于一点
- java中的命令怎么上移_web系统中上下移动功能的实现
- 统计学习(二):统计推断
- [Buzz Today]2012.05.10
- 【嵌入式系统—ARM指令集】快速了解
- ❤️对比PyWinAuto和uiautomation实现微信联系人自动采集❤️
- 方舟:生存进化官服和私服区别
- shell脚本之AWK-AWK的详细介绍
- 操作系统之文件管理(一)
- 海贼王热血航线正在连接服务器,航海王热血航线访问频繁进不去解决方法_航海王热血航线访问频繁怎么回事|微安卓...
- 关于 人工智能 的思考
- S.H.E -《Forever新歌+精选》192Kbps[MP3!]
- 「Gradle学习笔记」一、构建工具
- Excel柱状图,饼图,折线图