C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在
常量字符串 中或者 字符数组 中。
字符串常量 适用于那些对它不做修改的字符串函数.
一.求字符串长度函数——strlen
函数原型为size_t strlen ( const char * str );
需要注意的是:
函数返回的是'\0'前面字符的数量,必须要有'\0'的符号才会终止。
同时函数的参数是size_t是无符号的。
下面是对strlen函数的简单模拟。
第一种方法递归
第二种方法双指针法
第三种方法
二.长度不受限制的字符串函数
strcpy
函数原型:char* strcpy(char * destination, const char * source );
函数的作用是将后者复制到前者之后。
需要注意的是:
源字符串必须以 '\0' 结束。
会将源字符串中的 '\0' 拷贝到目标空间。
并且目标空间必须足够大和可改写。
下面是对其的模拟实现
先找到目标字符串的'\0'位置,然后再将第二个字符串首字符覆盖到'\0'位置,然后之后对应赋值即可(因为是先使用在自加所以可以实现覆盖的能力)。
strcat
函数原型为:char * strcat ( char * destination, const char * source );
函数的作用是连接
需要注意的是:
源字符串必须以 '\0' 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。
现在是对他的模拟:
strcmp
函数原型:int strcmp ( const char * str1, const char * str2 );
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
判断的原则是字典序。
现在是对他的模拟:
三.字符串查找
strstr
函数原型是char*strstr(const char* str1,const char *str2);
返回一个指向str1中第一次出现的str2的指针,或者如果str2不是str1的一部分,则返回一个空指针。
下面是对他的模拟实现。
strtok
函数的原型为char*strtok(char*str,const char*sep);
1.sep参数是字符串,定义用于作为分隔符的字符集合
2.第一个参数制定一个字符串,它包含0个或多个由sep字符串一个或者多个分隔符分割的标记。
3.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串
中的位置。
四.错误信息报告
streeor
函数会返回错误码,所对应的错误信息。
因为错误信息在计算机是通过0,1,2,3,4,5等来存储的,我们无法直接通过错误码来得到错误的信息,也就无法知道哪里错怎么解决。
函数的原型是char*strerror(int errnum);
参数即为错误码
五内存操作函数
memcpy
函数的作用是将源信息覆盖到目标信息上
void*memcpy(void*destination,const void*source,size_t);
需要注意的是
函数memcpy从source的位置向后复制num个字节到destination的内存位置
但不足之处是如果source和destination有着重叠的话,复制的结果不会是我们想要的结果,这个需要memmove来解决,下面会说到。
下面是对其的模拟实现
memmove
该函数的原型与memcpy完全一样,它能够解决memcpy中无法解决的source和destination相互重叠的问题,核心思想是通过改变覆盖的顺序来实现的。
通过下面的模拟实现就可以看出,
memcmp
函数的原型是int memcmp(const void*ptr1,const void*ptr2,size_t num);
进行的操作是比较从ptr1和ptr2指针开始的num个字节。
比较的原则是字典序。