本篇文章介绍字符串函数的使用以及模拟实现,这些字符串函数都需要包含头文件 string.h ,正文开始!
一.strlen的使用与模拟实现
size_t strlen (const char* str)
1.函数strlen是用来计算字符串长度的。
2.参数str指向的字符串必须以 ‘\0’ 结束。
3.strlen函数是返回的是在字符串中 ‘\0’ 之前出现的字符个数(不包含‘\0’)。
4.返回值是 size_t 类型,是无符号的!
strlen的模拟实现:
1.以计数器的方法模拟实现
size_t my_strlen(const char* str)
{
assert(str);//断言,防止传递空值,需要头文件 assert.h
size_t count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
2.不创建临时变量模拟实现(采取递归的方法)
size_t my_strlen(const char* str)
{
assert(str);//断言,防止传递空值,需要头文件 assert.h
if (*str == '\0')
return 0;
return 1+my_strlen(str+1);
}
3.我们知道 |指针-指针| 的输出结果为之间的元素个数,所以可以用 指针-指针 的方式模拟实现、
size_t my_strlen(const char* str)
{
assert(str);//断言,防止传递空值,需要头文件 assert.h
char* a = str;
while (*a)
{
a++;
}
return a-str;
}
二.strcpy的使用和模拟实现
strcpy的使用
char* strcpy(char* destination,const char* source)
1.函数strcpy是字符串拷贝函数,返回值为 char*。
2.参数source类型为 const char* ,表示要拷贝源字符串(const在*左边修饰说明源字符串内容不可修改);参数destination类型为 char* ,表示要拷贝到的目标空间。
3.源字符串必须以 ‘\0’ 结束,并且会将 ‘\0’ 拷贝到目标空间 。
4.目标空间必须足够大,要确保可以存放下源字符串,并且要保证目标空间可修改。
strcpy模拟实现:
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;//存储首元素地址
while ((*dest++ = *src++))
{
;
}
return ret;
}
三.strcat的使用和模拟实现
char* strcat(char* destination,const char* source)
1.函数strcat是字符串追加函数,将源字符串从目标字符串 ‘\0’ 处开始追加。
2.源字符串必须以 ‘\0’ 结束。
3.目标字符串也必须以 ‘\0’ 结束,否则不知道从哪开始追加。
4.目标空间必须足够大,要足够容纳源字符串大小,且目标空间可修改。
strcat模拟实现:
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;//存储首元素地址
while (*dest)
{
dest++;
}
while ((*dest++ = *src++))
{
;
}
return ret;
}
四.strcmp的使用和模拟实现
int strcmp(const char* str1,const char* str2)
1.函数strcmp是用来比较两个字符串大小的。
2.返回值为 int 类型,标准规定:第一个字符串大于第二个字符串时,返回大于0的数字;第一个字符串等于第二个字符串时,返回0;第一个字符串小于第二个字符串时,返回小于0的数字。
3.函数strcmp是通过比较两个字符串中对应位置上字符的ASCII码值大小来判断的。举个例子:
char* exm1="abcde" char* exm2="adc" strcmp(a,b)的返回值是什么呢?答案返回的是小于零的数。
因为strcmp是从每个字符串的第一位开始比较对应位置上字符的ASCII码值大小,如果这两个字符串对应位置上的字符相等,则都往后递推一位;在第二个位置上的字符exm1为 ‘b’,exm2为 ‘d’,'d' 的ASCII值比‘b’大, 所以exm2>exm1,返回值小于0。
strcmp的模拟实现:
char* my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
int ret = 0;
while (*str1==*str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return str1 - str2;
}
接下来要介绍的是长度受限制的字符串函数,这种字符串函数主要用于确保字符串不会超出预先设置的长度限制,以避免内存溢出等问题,保证了程序的安全性和稳定性。
五.strncpy的使用
char* strncpy(char* destination,const char* source,size_t num)
1.strncpy函数是用于将源字符串(source指向的字符串)的前num个字符拷贝到目标空间(destination指向的空间)。
2.源字符串的长度小于num时,拷贝完源字符串后,在目标后边追加 ‘\0’ 直到num个。
上例图!!!将str2的前三个字符拷贝到str1。
六.strncat的使用
char* strncat(char* destination,const char* source,size_t num)
1.strncat函数是字符串追加函数,是将源字符串(source指向的字符串)的前num个字符追加到目标空间(destination指向的空间)的末尾,再追加一个 ‘\0’ 。
2.源字符串长度小于num时,只会将源字符串中到 ‘\0’ 之前的内容追加到目标空间末尾。
举个例子:将str2的前四个字符追加到str1末尾。
七.strncmp的使用
int strncmp(const char* str1,const char* str2,size_t num)
1.字符串比较函数strncmp,比较str1和str2前num个字符,如果相等就继续向后比较,最多比较num个字母。
2.如果在num个字母前发现不一样:str1大于str2,返回大于0的数;str1小于str2,返回小于0的数。如果num个字符都相等,就返回0。
如图所示,输出的值小于0,说明str1<str2
八.strstr的使用和模拟实现
char* strstr(const char* str1,const char* str2)
1.strstr函数是用来查找字符串的,返回值为 char* 类型,返回的是字符串str2在字符串str1中第一次出现的位置。
2.如果字符串str2在字符串str1中找不到,则返回一个空指针。
如图所示:
strstr模拟实现
char* my_strstr(const char* str1, const char* str2)
{
char* pcur = (char*)str1;
char* s1, *s2;
if (str2 == NULL)
return ((char*)str1);
while (*pcur)
{
s1 = pcur;
s2 = (char*)str2;
while (*s1 && *s2 && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == NULL)
return pcur;
pcur++;
}
return (NULL);
}
以上便是strstr的模拟实现。
九.strtok函数的使用
char* strtok(char* str,const char*sep)
1.strtok函数是用来分割字符串的。
2.第一个参数指向了一个包含0个或多个由sep字符串中一个或多个分隔符分割的标记。
3.strtok函数找到str中的下一个标记, 并将其用‘\0’结尾,返回一个这个标记的指针。
4.strtok函数的第一个参数不为NULL时,函数找到str中的第一个标记,strtok将保存他在字符串中的位置。
5.strtok函数第一个参数为NULL时,函数将从同一个字符串中被保存的位置开始,查找下一个标记。
6.如果字符串中不存在更多的标记,则返回NULL。
注:strtok函数会改变被操作的字符串,所以我们使用strtok函数时通常用临时拷贝的内容并且可修改。
这么听上去可能很难理解,举个例子:
如图,str2中的分隔符为 | ' ,
for循环中的:strtok(str1,str2)作用是(第4点)找到str中的标记,strtok将保存他在字符串中的位置,并返回这个标记的指针(标记之前的所有字符);str(NULL,str2)的作用是(第五点)函数将从同一个字符串中被保存的位置开始,查找下一个标记。这样便构成了这个for循环。
其实从输出结果我们可以看出,就是将字符串从分隔符的位置把字符串分解成一个个小字符串。
十.strerror函数的使用
char* strerror(int errnum)
1.strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回,程序启动时参数errnum为0。
2.需要使用的头文件除了 string.h 外还需要 errno.h 。
如图所示打印了1-10对应的错误信息字符串。
下图为代码演示:
以上便是本篇的全部内容,如有错误,欢迎大家在评论区指出,讨论。制作不易,给个三连吧。