前言
本篇博文将讲解重点介绍处理字符和字符串的库函数的使用和注意事项。
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在
常量字符串 中或者 字符数组 中。
字符串常量 适用于那些对它不做修改的字符串函数.
求字符串长度
strlen
用于求取一个字符串的长度,使用格式如下
size_t strlen ( const char * str );
说明:字符串已经把'\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' ),参数指向的字符串必须要以 '\0'结束
易错点分析:注意函数的返回值为size_t,是无符号的。这句话怎么理解呢?请看以下代码
1. #include <stdio.h> 2. int main() 3. { 4. const char*str1 = "abcdef"; 5. const char*str2 = "bbb"; 6. if(strlen(str2)-strlen(str1)>0) 7. { 8. printf("str2>str1\n"); 9. } 10. else 11. { 12. printf("srt1>str2\n"); 13. } 14. return 0; 15. }
上述代码中, strlen(str2) = 3 ; strlen(str1) = 6 。按照一般道理说,此时strlen(str2)-strlen(str1)应该小于0,应该输出str2>str1。那么结果真的是这样吗?我们看一下运行结果
结果却是str2
是因为:函数的返回值为size_t,strlen(str2)-strlen(str1) = -3,-3在内存中的存储为下图所示
模拟实现strlen
模拟实现strlen,只需要遍历字符串,遇到'\0'停止就好
方式一
1. int my_strlen(const char * str) 2. { 3. int count = 0; 4. while(*str) 5. { 6. count++; 7. str++; 8. } 9. return count; 10. }
方式二
1. int my_strlen(const char * str) 2. { 3. if(*str == '\0') 4. return 0; 5. else 6. return 1+my_strlen(str+1); 7. }
方式三
1. int my_strlen(char *s) 2. { 3. char *p = s; 4. while(*p != ‘\0’ ) 5. p++; 6. return p-s; 7. }
长度不受限制的字符串函数
何为长度不受限制呢?也就是说在作用于字符串时,没有长度限制,遇'\0'停止
strcpy
用于拷贝字符串,使用格式如下
char* strcpy(char * destination, const char * source );
说明:1、源字符串必须以 '\0' 结束。 2、会将源字符串中的 '\0' 拷贝到目标空间。 3、目标空间必须足够大,以确保能存放源字符串。 4、目标空间必须可变。
模拟实现 strcpy
1. char *my_strcpy(char *dest, const char*src) 2. { 3. char *ret = dest;//记录的dest的首地址 4. assert(dest != NULL);//断言,防止空指针 5. assert(src != NULL); 6. while((*dest++ = *src++))//一步步遍历,直至遇\0结束 7. { 8. ; 9. } 10. return ret;//首地址 11. }
strcat
实现字符串追加,将source里的字符串追加到destination后面,格式如下
char * strcat ( char * destination, const char * source );
说明:
1、源字符串必须以 '\0' 结束。
2、目标空间必须有足够的大,能容纳下源字符串的内容。
3 、目标空间必须可修改。
4、字符串不可以自己给自己追加
模拟实现strcat
只需要遍历destination到\0,然后再用source对destination里的0及以后的元素进行一一替换就好,最后还要加上source里的\0;代码实现如下
1. char *my_strcat(char *dest, const char*src) 2. { 3. char *ret = dest;//记录起始位置 4. assert(dest != NULL);//防止dest为空指针 5. assert(src != NULL); 6. while(*dest) 7. { 8. dest++;//使dest遍历到\0的位置 9. } 10. while((*dest++ = *src++))//进行一一替换,先++,所以\0也进行了替换了 11. { 12. ; 13. } 14. return ret; 15. }
strcmp
对两个字符串进行大小比较,格式如下
int strcmp ( const char * str1, const char * str2 );
说明 :两字符串比较是一位一位进行比较的,实际比较的是它们的ascll值。
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
模拟实现strcmp
只需要两个元素一个个进行遍历比较就好,最后返回相应的值就可以了,代码如下
1. //int my_strcmp(const char* str1, const char* str2) 2. //{ 3. // assert(str1 && str2);//断言,不为空 4. // 5. // while (*str1 == *str2)//进行判断,是否相等 6. // { 7. // if (*str1 == '\0')//判断是否字符串遍历结束 8. // return 0; 9. // 10. // str1++;//遍历 11. // str2++; 12. // } 13. // 14. // return (*str1 - *str2);//返回值 15. //}