大家可能会遇到这样的题目,不使用C语言库函数来实现拷贝字符串和求字符串长度的功能。本文就是来详细地说明如何模拟实现这两个函数的功能。
strcpy部分
函数的参数形式char* strcpy(char*destination,const char*source);
该参数说明了strcpy返回类型是char类型的指针,将源头(不能被改)拷贝到目的地。
strcpy特点和strlen类似,遇到‘\0’就停止。
比较容易想到的写法是:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<assert.h> void my_strcpy(char* a, char* b) { while (*a != '\0') { *b = *a; b++; a++; } *b = *a; } int main() { char a[] = "abcdef"; char b[10]; my_strcpy(a, b); printf("%s", b); return 0; }
虽然可以实现strcpy函数的内容,但是优化不怎么样,将简单的功能写的非常麻烦,且无法避免空指针的情况,下面为优化后的写法:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<assert.h> void my_strcpy(char a[],char b[]) { assert(a!=NULL&&b!=NULL);//断言函数来避免空指针的情况 while (*b++ = *a++) { ;//当*a为\0的时候,while里的值为假,跳出循环 } } int main() { char a[] = "abcdef"; char b[10]="";//定义第二个数组来拷贝数组 my_strcpy(a,b); printf("%s", b); return 0; }
strlen部分
函数的参数形式 size_t strlen(const char* str);
size_t表示的是无符号数,const放的位置表示*str所指向的内容不可以被改变。
strlen函数的特点是遇到’\0’就停止了,且只能用来求字符的长度。
比较容易想出来的方法如下所示:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<assert.h> int my_strlen(const char str[]) { int count = 0; assert(str != NULL);//这里使用assert断言函数来防止空指针的情况 while (*str) { count++; str++; } return count; } int main() { char str[10] = "abcdef"; printf("%d",my_strlen(str)); return 0; }
虽然可以实现strlen函数的内容,但是优化不怎么样,将简单的功能写的非常麻烦,且无法避免空指针的情况,下面为优化后的写法:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int my_strlen(const char a[])//用const来使代码更加安全 { int count = 0; while (* a++ != '\0') { count++; } return count; } int main() { char a[]="abcdef"; int b = my_strlen(a); printf("%d", b); return 0; }
在这里深入讲解一下strlen函数。上面已经提到函数的参数形式 size_t strlen(const char* str);
而size_t表示的是无符号数,必定是正数。
strlen返回值类型是无符号数,所以strlen("字符串")-strlen("字符串")必是大于0的数。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> int main() { size_t count = strlen("chen") - strlen("chendadachen");//得到的结果一定大于0 printf("count=%u", count);//打印%u时,因为是无符号,所以必定为正数,而正数原码补码相同,打印的是补码。 return 0; }
如果大家发现代码讲解有问题的话,请一定要不吝赐教告诉我!