目录
1.字符分类函数
2.字符转换函数
3.strlen的使用和模拟实现
4.strcpy的使用和模拟实现
5.strcat的使用和模拟实现
6.strcmp的使用方法及模拟实现
7.strncpy函数的使用与模拟实现
8.strncat函数的使用方法以及模拟实现
9.strncmp函数的介绍
10.strstr的使用和模拟实现
1.字符分类函数
C语言中有一系列的函数是用来做字符分类的,也就是一个字符是属于什么类型的字符的。
这些函数的使用都需要包含的一个头文件是<ctype.h>
下图就是这些函数
他们的返回值是int,而且只具有一个参数,而且他们的使用方法极其相似,我们只讲解其中一个函数即可大彻大悟一通百通。
int islower (int c)
这个函数是用来判断参数是否为小写字母的,如果是小写字母的话就会返回一个非0的值,不是小写字母的话就会返回0.如下图所示
现在我们进行一个练习:
写一个代码,将字符串中的小写字母转大写,其他字符不变。
我们刚刚已经知道了islower的运用方法,我们只需要使用islower判断出字符串的小写字母,然后让这个字符减去32即可得到大写字母。
2.字符转换函数
C语言库中提供了两个字符转换函数
int tolower(int c);//将参数传进去的大写字母转小写.int toupper(int c);//将参数传进去的小写字母转大写.
有了这两个函数,我们就可以不通过ASCII码的计算来完成小写字符转大写字符,直接使用这个函数即可。
#include <stdio.h>
#include <ctype.h>
int main()
{char arr[] = "kuku";for (int i = 0; arr[i] != '\0'; i++){if (islower(arr[i])){//arr[i] -= 32;arr[i]=toupper(arr[i]);putchar(arr[i]);}}return 0;
}
3.strlen的使用和模拟实现
这个函数是用来求字符串长度的
函数原型如下
size_t strlen(const char* str)
1.这串代码返回的是字符串'\0'之前的字符个数
2.参数指向的字符串必须要以‘\0’结尾
3.函数的返回值是size_t,是无符号的。
4.strlen的使用需要包含<string.h>头文件
现在我们使用strlen函数来比较一下两个字符串的长度
#include <stdio.h>
#include <string.h>
int main()
{const char* str1 = "asdfadfgsfxcvbstrfg";const char* str2 = "nihaoyawoshikuku";if (strlen(str1) - strlen(str2) > 0){printf("字符串1长");}else{printf("字符串2长");}return 0;
}
输出结果:字符串1长
下面我们来模拟实现一下strlen函数
#include <stdio.h>
#include<assert.h>
//计数器的方式
int strlen1(const char* str)
{int count = 0;assert(str);while (*str){str++;count++;}return count;
}
//递归方式
int strlen2(const char* str)
{assert(str);if (*str == '\0'){return 0;}else{return 1 + strlen2(str+1);}
}
//指针运算方式
int strlen3(const char* str)
{assert(str);char* p = str;while (*p!='\0'){p++;}return p - str;
}
int main()
{const char *str = "asdfg\0";int a = strlen1(str);int b = strlen2(str);int c = strlen3(str);printf("a=%d\nb=%d\nc=%d", a, b, c);return 0;
}
4.strcpy的使用和模拟实现
char* strcpy(char* destination, const char* source);//功能是把第二个参数从第一个参数的第一个字符位置复制到第一个字符串中
1.源字符串必须以'\0'结尾
2.会将源字符串的’\0‘拷贝到目标空间中
3.目标空间必须足够大,以确保能够存放源字符串
4.目标空间必须可修改-->不能被static和const修饰
它的实现非常简单,现在我们来实现一下
char strcpy(char* dest, const char* src)
{assert(dest);assert(src);char* ret = dest;//版本1while (*dest){*dest = *src;dest++;src++;}//第一步优化while (*dest){*dest++ = *src++;}//第二布优化while (*dest++ = *src++)//虽然是写在判断条件内部,但由于是指针操作//所以操作结果可以保存在内存中{;}return ret;
}
5.strcat的使用和模拟实现
函数原型如下:
char* strcat(char* destination, const char* source);
它的作用是在字符串的末尾追加字符。
1.源字符串必须以'\0'结束
2.目标字符串中也得有’\0‘,否则没办法知道从哪里开始追加
3.目标空间必须足够的大,能够容纳下源字符串的内容。
4.目标空间必须可修改。
5.无法使用这个函数给自己追加。
现在模拟实现一下这个函数:
char* strcat(char* dest, const char* src)
{assert(dest);assert(src);char* p = dest;while (*dest){dest++;}while (*dest++ = *src++){;}return p;
}
6.strcmp的使用方法及模拟实现
strcmp()
函数是C语言中用于比较两个字符串的函数。它会逐个字符比较两个字符串,直到遇到不同的字符或者其中一个字符串的结束符 \0
。
具体来说,
strcmp()
函数的作用是:
- 如果两个字符串相等,返回值为0。
- 如果第一个字符串小于第二个字符串,返回值为负数。
- 如果第一个字符串大于第二个字符串,返回值为正数。
这里再给大家详细解释一下字符串的比较。
我们知道的是,在比较数字时,我们会先比较高位,再比较低位。
我们比较字符串运用的就是这个原理!从高位向低位比较ASCII码的值。
那么现在我们来实现一下这个函数。
int strcmp(const char* str1, const char* str2)
{int ret = 0;while (*str1 == *str2){if (*str1 == '\0')//如果str1和str2都等于\0,会进入循环内。//if语句用来判断这个。{return 0;}str1++;str2++;}return *str1 - *str2;
}
7.strncpy函数的使用与模拟实现
这个函数的原型如下
char * strncpy(char* destination,const char* source,size_t num)
strncpy函数是一个字符串拷贝函数,它可以拷贝num个字符从源字符串到目标空间。
1.目标空间和源空间不可重叠,若重叠则需要使用内存拷贝函数。后续会介绍给大家
2.如果源字符串的长度小于num,则在拷贝完源字符串后,在目标的后面追加0,直到num个。
现在我们来模拟实现一下这个函数
//实现方法1
char* strncpy1(char* destination, const char* source, size_t num)
{char* ret = destination;while (*source&&num){*destination++ = *source++;num--;}while (num > 0){*destination++ ='0';num--;}return ret;
}
//实现方法2
char* strncpy2(char* destination, const char* source, size_t num)
{int i = 0;char* ret = destination;while (*source && num){*destination++ = *source++;num--;}while (num){*destination++ ='0';num--;}return ret;
}
//实现方法3
char* strncpy3(char* destination, const char* source, size_t num)
{int i;for (i = 0; src[i] && i < n; i++){destination[i] = src[i];}if (i < n){dst[i] = 0;}return dst;
}
8.strncat函数的使用方法以及模拟实现
函数原型如下:
char * strncat ( char * destination, const char * source, size_t num );
1.strncat是一个字符串追加函数,可以将这个函数指向的source字符串的前num个字符追加 到destination指向的字符串末尾,再追加一个‘\0’.
2.如果source指向的字符串长度小于num,则只会将字符串到\0的内容追加到destination的末尾。
现在我们来模拟实现一下这个函数。
#include <stdio.h>
#include <assert.h>
char* strncat(char* dest, const char* src,size_t n)
{assert(dest);assert(src);char* ret = dest;while (*dest){dest++;}while (*src&&n){*dest++ = *src++;n--;}*dest = '\0';return ret;
}
int main() {char dest[100]="bendan";const char* src = "Hello";char* result1 = strncat(dest, src, 8);char* result2 = strncat(dest, src, 3);printf("%s\n", result1);printf("%s\n", result2);return
相信大家经过实现这些函数已经发现了这类函数的实现方法,下面的函数将不再模拟实现。
9.strncmp函数的介绍
这个是一个字符串比较函数,但是只比较num个字符。
函数原型如下:
int strncmp ( const char * str1, const char * str2, size_t num );
这个函数是比较str1和str2的前num个字符,如果相等就继续向后比较,一直比较到第num个字符。
10.strstr的使用和模拟实现
这个函数超级重要!!!
strstr函数是一个字符串查找函数,它的函数原型如下;
char * strstr ( const char * str1, const char * str2);
1.这个函数的作用是查找并返回字符串str2在字符串str1中第一次出现的地址(指针)
2.如果str2不在str1中,则返回空指针
3.字符串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志
我们先来使用一下他!
这段代码的功能是先找到simple在str中出现的位置,然后返回第一次出现的地址,之后再使用字符串拷贝函数,将i替换为a.
现在我们来模拟实现一下这个函数
char* my_strstr(const char* str1, const char* str2)
{char* cp =str1;char* s1,*s2;if (!*str2)//如果为空,则为真,则进入语句块。{return str1;}while (*cp){s1 = cp;s2 = str2;while (*s1 && *s2 && !(*s1 - *s2)){s1++;s2++;}if (!*s2){return cp;}cp++;}
return NULL;
}
int main()
{char str[] = "This is a simple string";char* pch;pch = my_strstr(str, "simple");//注意这个函数的返回值printf("%s\n", pch);strncpy(pch, "sample", 10);printf("%s\n", pch);return 0;
}
在这里说以下这个函数的实现思路。
首先,str2为空时,我们应直接返回str1。
其次,我们每次比较完都要让str1走一步,因此需要定义一个指针cp来一步步的走。而且,这个指针不能在循环内部有+1之外的操作。因此我们比较还需要定义一个指针s1等于cp。
之后,每次比较完毕后,若不符合条件,则str2需要回到初始地址。所以我们需要定义两个指针来表示str1和str2.
最后,如果在比较的过程中,我们发现在str1中找到了str2,就可以返回cp的地址了。