超详细讲解长度不受限制的字符串函数(保姆级教程!!!)
- 一、求字符串长度函数
- strlen
- strlen函数的使用
- strlen函数与sizeof的区别
- strlen函数的模拟实现
- 二、长度不受限制的字符串函数
- strcpy函数
- strcpy函数的使用
- strcpy函数的模拟实现
- strcat函数
- strcat函数的使用
- strcat函数的模拟实现
- strcmp函数
- strcmp函数的使用
- strcmp函数的模拟实现
一、求字符串长度函数
strlen
size_t strlen(const char *str) ,即strlen函数是计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。
strlen函数的使用
下面为strlen函数的使用例子。
#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; }
而上述代码的输出结果,在于strlen函数的特点。
1、字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包
含 ‘\0’ )。
2、参数指向的字符串必须要以 ‘\0’ 结束。
3、注意函数的返回值为size_t,是无符号的。
4、学会strlen函数的模拟实现。
strlen函数与sizeof的区别
首先,strlen 是函数,sizeof 是运算操作符,二者得到的结果类型为 size_t,即 unsigned int 类型。大部分编译程序在编译的时候就把 sizeof 计算过了,而 strlen 的结果要在运行的时候才能计算出来。
对于以下代码:
char *str1 = "asdfgh";
char str2[] = "asdfgh";
char str3[8] = {'a', 's', 'd'};
char str4[] = "as\0df";
输出结果是:
sizeof(str1) = 4; strlen(str1) = 6;
sizeof(str2) = 7; strlen(str2) = 6;
sizeof(str3) = 8; strlen(str3) = 3;
sizeof(str4) = 6; strlen(str4) = 2;
那让我们来看下面这一段代码:
#include <stdio.h>
int main()
{char str[] = "hello bit";printf("%d %d\n", sizeof(str), strlen(str));return 0;
}
输出的结果是10与9。
这是因为str字符数组使用"hello bit"初始化,最终也会将’\0’放置到数组中,因此数组中总共有10个元素。
sizeof(str):获取数组的总大小(包括‘\0’),10个元素,每个元素占1个字节,因此总共是10个字节。
strlen(str): 获取字符串中有效字符的个数,不算’\0’,因此总共9个有效字符。
故上述printf会分别打印:10 9
strlen函数的模拟实现
strlen函数的模拟实现有三种不同的方法。
1、用递归实现模拟:
int my_strlen1(const char* str)
{assert(str != NULL);if (*str != '\0')return 1 + my_strlen(str + 1);elsereturn 0;
2、用“指针-指针”的方式进行模拟:
int my_strlen2(const char* str)
{const char* start = str;assert(str != NULL);while (*str){str++;}return str - start;
3、常规的、暴力算法实现模拟:
int my_strlen(const char* str)
{assert(str != NULL);int count = 0;while (*str != '\0'){count++;str++;}return count;
}
以上三种方法都可以实现strlen函数的模拟。
二、长度不受限制的字符串函数
strcpy函数
strcpy 函数把 src 所指向的字符串复制到 dest。
需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。dest – 指向用于存储复制内容的目标数组。
src – 要复制的字符串。
该函数返回一个指向最终的目标字符串 dest 的指针。
strcpy函数的使用
先来看一个strcpy函数的使用例子:
#include <stdio.h>
#include <string.h>int main()
{char src[40];char dest[100];memset(dest, '\0', sizeof(dest));strcpy(src, "This is runoob.com");strcpy(dest, src);printf("最终的目标字符串: %s\n", dest);return(0);
}
上面程序的输出结果是: This is runoob.com
strcpy函数具有以下的特点:
1、源字符串必须以 ‘\0’ 结束,并且会将源字符串中的 ‘\0’ 拷贝到目标空间。
2、目标空间必须足够大并且可变,以确保能存放源字符串。
需要注意的是,strcpy函数适合的场景一般是一个对象里有内容,另一个没有内容。
strcpy函数的模拟实现
char* my_strcpy(char* dest, const char* src)
{char* ret = dest;assert(dest && src);while (*dest++ = *src++){;}return ret;
strcat函数
strcat是把 src 所指向的字符串追加到 dest 所指向的字符串的结尾的函数。
dest – 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串。
src – 指向要追加的字符串,该字符串不会覆盖目标字符串。
该函数返回一个指向最终的目标字符串 dest 的指针。
strcat函数的使用
下面的实例演示了 strcat函数的用法:
#include <stdio.h>
#include <string.h>int main ()
{char src[50], dest[50];strcpy(src, "This is source");strcpy(dest, "This is destination");strcat(dest, src);printf("最终的目标字符串: |%s|", dest);return(0);
}
执行上述的程序,将产生以下结果:
最终的目标字符串: |This is destinationThis is source|
strcat函数的特点如下:
1、源字符串必须以 ‘\0’ 结束。
2、目标空间必须有足够的大,能容纳下源字符串的内容。
3、目标空间必须可修改。
但对于strcat函数需要注意一个点,那就是使用strcat函数自己给自己进行追加可以吗?
#include <stdio.h>
#include <string.h>int main ()
{char dest[20]="abcdef";strcat(dest, dest+2);printf("%s", dest);return(0);
}
上述函数的输出结果会是什么?
这时候系统会进行报错,因为程序已经崩溃了,而我们也可以看看监控下的dest数组的状态。
我们会发现,原本我们只是想让dest数组自己给自己再追加“abcedf”的,但结果dest陷入了无限次给自己增加的死循环中,导致dest数组无法容纳这么多数据而崩溃。
因为strcpy的原理是先找到目标字符串的结束字符\0,然后目标字符串后面的\0会被源字符串的第一个字符覆盖,而后源字符串的字符被逐个追加到目标字符串后面,每追加一个字符,源地址和目标地址就加1,直到源地址上的字符为结束字符\0才会停止。
而在上述情况中使用strcat给自己进行增加,就会出现dest的“\0”标志会被第一个字符“a”给取代,而这时候因为是给自己进行增加,所以增加的数组原本是遇到“\0”就会停止的,但此时“\0”已经不见了被替代了。
strcat函数的模拟实现
char* my_strcat(char* dest, const char* src)
{assert(dest && src);char* ret = dest;//1. 找目标空间的\0while (*dest){dest++;}//2. 追加while (*dest++ = *src++){;}return ret;
}
strcmp函数
strcmp函数是将 str1 所指向的字符串和 str2 所指向的字符串进行比较。
str1 – 要进行比较的第一个字符串。
str2 – 要进行比较的第二个字符串。
该函数返回值如下:
如果返回值小于 0,则表示 str1 小于 str2。
如果返回值大于 0,则表示 str1 大于 str2。
如果返回值等于 0,则表示 str1 等于 str2。
strcmp函数的使用
下面是strcmp函数的使用例子:
#include <stdio.h>
#include <string.h>int main ()
{char str1[15];char str2[15];int ret;strcpy(str1, "abcdef");strcpy(str2, "ABCDEF");ret = strcmp(str1, str2);if(ret < 0){printf("str1 小于 str2");}else if(ret > 0) {printf("str1 大于 str2");}else {printf("str1 等于 str2");}return(0);
}
执行上述程序后的输出结果是:str1 大于 str2。
需要注意的是,字符串大小的比较本质上是根据每个字符的Asall表值大小进行比较得到的,从字符串的第一个字母进行比较,如果相等就依次往后继续比较,直至比较出结果或者遇到\0为止。
strcmp函数的模拟实现
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;elsereturn -1;*/return *str1 - *str2;
}
那么,今天的长度不受限制的字符串函数的相关内容我就讲述完啦,因为个人能力有限,文章难免会出现纰漏,届时有错误可以私信发给我以及时更正,谢谢大家!