时间:2022-06-01 11:24:40 | 栏目:C代码 | 点击:次
今天分享一下这几天对string库函数的一些认识和理解?。
string,中文就是字符串的意思。顾名思义,也就是说在这个库函数头文件中的函数,都是用来处理和分析字符串的,对我们使用及研究字符串具有极大的意义。而在平时,我们对一些处理字符串的函数并不频繁使用,导致当我们想要用到它时却忘记了使用方法。
接下来,我将举出string头文件中几个较为常见的函数,总结他们的用法和记忆方法。
strlen函数是string头文件中最常见的一个函数,用于求字符串的长度。 strlen英文全称string length,既字符串长度,可以顾名思义地来记忆。
?这是从c++ reference上截取的介绍,strlen函数的用法就是向其传入一个字符串数组的首元素地址,其返回值是字符的个数。
?演示代码如下:
#include<string.h> int main() { char str[] = "abc"; int len1 = strlen(str); int len2 = strlen("abc"); printf("%d\n%d", len1,len2); return 0; }
!!这里应该注意的是,"abc"表示的也是一个字符串数组,其传给strlen函数的是首元素地址。
运行结果:
?下面我们试着运行一下这个代码:
#include<string.h> int main() { char str1[] = "abc"; int len1 = strlen(str1); char str2[] = { 'a','b','c'}; int len2 = strlen(str2); printf("%d\n%d", len1,len2); return 0; }
运行结果:
?为什么这里的str2的长度会是13呢?乍一看不是abc三个元素,长度为3吗?
这里需要补充一个知识点。在C语言中,系统会在字符串数组最后加上一个’\0’作为结束标志。而strlen函数的工作原理就是计算传入数组 (首元素地址指针指向的数组)在’\0’之前的元素个数,既该字符串长度。
而该代码块中所定义的str数组并不是一个字符串数组,因此’\0’的位置并不在最后一个元素后面,而是一个随机的位置,strlen函数会一直计算长度直到遇见’\0’才停止工作并返回结果。
因此,strlen(str2)会返回一个随机值,该值不代表该数组的长度。
通过调试验证了str1字符串数组末端有一个’\0’而str2没有。
strcpy,英文全称copies strcpy,也是一个string头文件中较为常见的函数,用于将一个字符串的内容复制到另一个数组中。
(再次引用c++ reference中的描述,发现这种英文的工具网站的描述比中文的清晰地多)
?strcpy的使用方法是向其传入两个指针,前者是目标数组首元素地址指针,后者是原字符串数组地址指针,将原字符串数组(包括末尾结束标志’\0’)拷贝到目标数组中。若目标数组中本身具有元素,则根据原字符串数组的长度一一覆盖。(?注意:为了防止数组溢出,目标数组长度应大于原字符串数组。)
?演示代码如下:
#include<string.h> int main() { char str1[] = "abcdefg"; char str2[] = "123"; strcpy(str1, str2);//str2==>str1 printf("%s", str1);//打印拷贝处理后的str1 return 0; }
运行结果:
可见,str2的内容完美地拷贝到str1中了。
通过调试可以发现,str2的内容覆盖了str1前四个元素,而后面的元素依然存在。但是因为str2的’\0’也跟着拷贝过去了,所以在打印的时候,由于printf格式控制符是%s(既字符串类型),在遇到第一个’\0’时则认为它是字符串结束标志,结束打印。因此,打印出来的结果是字符串"123"。
strcmp函数,英文全称compares string(字符串比较), 既用于比较两个字符串,那么这里是比较字符串的什么呢?这里的比较是这样的:先比较两个字符串的第一个字符的ASCII码值(这里视为第一对字符),(下面的比较均是ASCII码值的比较)如果第一个字符串的第一个字符大于第二个字符串的第一个字符,则返回1;反之,则返回-1;若两个字符相等,则进行下一对字符的比较,直到出现有一对字符不同则返回相应的值(1或-1)。若两个字符串所有的字符都相同,则返回数字0。
传入两个指针,代表两个字符串数组的首元素地址。
?演示代码如下:
#include<string.h> int main() { char str1[20]; char str2[20]; scanf("%s%s", str1, str2); int ret=strcmp(str1, str2); switch (ret) { case 0:printf("str1=str2");break; case 1:printf("str1>str2");break; case -1:printf("str1<str2");break; } return 0; }
运行结果:
可见,这里的比较和我们所描述的相一致。
?这里应该注意,'\0’的ASCII码是0,它与其他字符都小。
(先介绍strcat)
strcat,英文全称concatenates string(连接字符串),这里很容易理解,strcat函数就是用于连接两个字符串的,那么它是如何连接的呢?接下来我将介绍一下它的具体用法。
?如图所示,使用strcat函数需向其传入两个指针,前者是目标数组首元素地址指针,后者是原字符串数组地址指针(与strcpy类似,只不过这里是将原字符串接到目标字符串后面)。传参成功后,strcat会将原字符串的第一个字符覆盖到目标字符串的’\0’位置,后面再接着原字符串剩下的全部字符,直到遇见’\0’后结束,保证了拼接后的字符串只有一个结束标志’\0’。
?演示代码如下:
#include<string.h> int main() { char str1[5]="ab"; strcat(str1, "cd"); printf("%s\n", str1); char str2[5] = "ab"; char str3[3] = "cd"; strcat(str2, str3); printf("%s\n", str2); return 0; }//原字符串可以用字符串数组也可以直接用字符串,结果相同
运行结果:
如果我们想让拼接后的字符串更长,能不能修改一下原字符串实现呢?让我们来试试看?
int main() { char str1[5]="ab"; strcat(str1, "cde"); printf("%s\n", str1); }
运行结果:
运行出错,引发了异常,这是为什么呢?
?这里是因为发生了数组溢出,由于"cde"字符串加上’\0’有四个字符,而str1我们规定了长度为5,当"cde"拼接在str1后覆盖了它的’\0’之后,拼接字符串一共有六个字符,超过了目标字符串str1的长度,无法容纳拼接后的字符串,所以发生了错误。
?由此我们可得,在使用strcat函数时,要规定给目标字符串一个合适的长度,防止数组溢出。
strstr,英文全称Locate substring,既定位子字符串。strstr的返回值比较特殊,它是通过传入一个母字符串和一个子字符串,然后在母字符串中定位子字符串的位置,返回值为指向母字符串中第一次出现的子字符串中指定的整个字符串的指针。若子字符串不属于母字符串的一部分,则返回空指针NULL。
?演示代码如下:
#include<string.h> int main() { char str1[20]="I love you"; char* p1 = strstr(str1, "you"); char* p2 = strstr(str1, "me"); printf("%s\n%s\n", p1,p2); }
运行结果:
memset函数,英文全称Fill block of memory,既填充内存块。memset的作用是将指针指向的内存块(这里可以认为是字符串)的第一个字节数设置为指定的值。
?演示代码如下:
#include<string.h> int main() { char str[20]="I love you"; memset(str, '-', 2); printf("%s\n", str); return 0; }
运行结果:
显而易见,其结果无非就是将两个’-'填充到str字符串的前两个位置。
??库函数的灵活应用是程序员的一大重要技能!在总结这篇文章的时候我发现自己的string库函数以及其他库函数仍有不了解的地方,需要不断地查资料去了解。总结下来,巩固了自己对这部分知识的掌握,也希望能为您带来帮助,感谢支持!欢迎大佬雅正。