本篇主要讲述字符串函数和内存函数。
1.字符串函数
(1).求字符串长度的函数
strlen:
函数原型:size_t strlen(const char *str)
函数的意思: 函数的返回值是size_t,即为无符号整型的数据类型,const用来保证字符串不会发生改变,而形参为字符型指针,用来接收数组首元素地址。
函数执行过程: 指针一直从低地址指向高地址,直到遇到\0,函数就结束,函数计算得到值就返回
注意: 函数所计算的长度不包括\0;字符串中若没有\0,函数就一直执行下去,可能指针会越界,直到遇到\0,那么函数就会返回一个随机值。
(2)长度不受限制的字符串函数:
①字符串拷贝函数strcpy:
函数原型:
char*strcpy(char*destination,const char source);
函数的意思: 把字符串或字符数组的数据,拷贝到字符数组中,而destination这个指针为拷贝的目的地的地址,source为背拷贝的的字符串的地址;const用来保证原字符串的内容不可变,返回值返回目标空间的地址。
函数执行过程: 通过赋值的方式进行,原字符串要以\0结束,同时也会被拷贝到目标空间中。
注意: 目标空间要足够大,以确保能放下源字符串;目标空间必须可变。
②字符串追加(连接)函数strcat:
函数原型:
char*strcat(char*destination,const*source)
函数的意思: 把两个字符串连接起来,const保证原字符串的内容不可变,返回值返回目标空间的地址。
执行过程: 执行中保证源字符串与目标字符串都要有\0,首先,先用一个变量来保存目标空间的地址,然后目标字符串的指针执行最后的\0,接着,再把原字符串的内容赋值给目标空间\0及以后的空间,最后带着目标字符串的首元素地址返回。
注意: 原字符串要以\0结束,即原字符串要把\0也赋值过去;目标空间要足够大,能容下原字符串的内容;目标空间可修改;相同字符串不可追加(连接),这样会改变\0,使字符串的内容没有\0,这样指针不会停止,导致指针越界,程序出错。
③字符串比较函数strcmp:
函数原型:int strcmp(const char*str1,const char*str2);
函数意思:const的意思和上面的一样;其中返回一个整形的数据。
执行过程: 字符串比较通过字符的ascii码来比较,通过指针指向一个个字符,比较相同时会跳过直至到\0。
注意: str1大于str2是,返回一个大于0的数字;str1小于str2时,返回一个小于0的数字,当相等时,则返回0。
(3)长度受限制的字符串函数:
字符串拷贝函数 strncpy:
char * strncpy ( char * destination, const char * source, size_t num );
字符串连接函数 strncat:
char * strncat ( char * destination, const char * source, size_t num );
字符串比较函数 strncmp:
int strncmp ( const char * destination, const char * source, size_t num );
函数的意思: 函数的大致意思基本和上面的描述一致,但多了个size_t num,表示的是指限制函数功能实现的字符的个数,作用更加细化。
(4)字符串查找
①strstr
函数原型:
char*strstr(const char*str1,const char*str2);
函数意思:在str1中找与str2相同的字符串(内容)
模拟实现:
图例
②strtok:
函数原型: char *strtok( char*str,char*sep);
函数意思: 把字符串中的所有分隔符去掉,得到被分隔符分开的几个字符串。str为目标字符串的地址,sep为放分隔符的数组的地址。
执行过程: strtok(str,sep);
strtok(NULL,sep);
strtok(NULL,spe);
首先先找到第1个分隔符,把分隔符变为\0,返回一个被分隔后,分隔符前面的这个字符串的首元素地址,并且函数将保存分隔符在字符串中的位置,当第2次调用的时候,函数的第1个参数为NULL时,函数将在同一个字符串中被保存的位置开始,接下来调用也是一样的,
注意: NULL相当于没用,因为该函数第一次调用地址已经保存了的,第二次调用传空指针就行了;在执行函数中,原来的字符串的内容会被改变,所以可以先拷贝下来。
以下为例子:
2.内存函数
(1)内存拷贝函数 memcpy
函数原型: void*memcpy(void*destination,const void*source,size_t num);
函数特点: 能拷贝不同的数据类型;遇到\0不会停;大意是吧把source所指向的num个字节的内容拷贝到destination去。
(2)内存拷贝函数 memmove
函数原型: void*memmove(void*destination,const void*source,size_t num);
函数特点: 与memcpy不同的是,memmove可以在同一个字符串中可处理重叠的情况。
(3)内存比较函数memcmp
函数原型: int memcmp(const void*ptr1,const void*ptr2,size_t num)
函数特点: 比较从p1和p2指针开始的num个字节,就比较多少个字节其主要功能是比较两段内存区域的大小,也就是按字节比较两个内存区域中相应字节的值(内容)的大小;返回值与strcmp一样;可以比较不同类型的数据,与字符串的比较相似。
以上是部分函数内容,如有错误希望斧正。