引言
字符串函数虽然是已经包装的函数,但是函数的内部实现仍然很有价值,这篇文章,主要对比数组实现和指针实现的异同之处,便于对指针的深入理解。
mystrlen
int my_strlen( const char *str );
数组实现
int mystrlen(const char* arr) {
if (arr == NULL)
return 0;
int count = 0,i=0;
while (arr[i++]!= '\0') {
count++;
}
return count;
}
指针实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
int mystrlen(const char* pstr) {
if (pstr == NULL)
return 0;
int count = 0;
while (*pstr++ != '\0') {
count++;
}
return count;
}
mystrcpy
char *my_strcpy( char *dest, const char *src );
数组实现
void my_strcpy1(char* arr, char* brr) {
int i = 0;
while (arr[i] = brr[i]) {
i++;
}
}
// brr 数据拷贝给 arr
void my_strcpy2(char* arr, char* brr) {
int len = strlen(brr);
for (int i = 0; i <= len; i++) {
arr[i] = brr[i];
}
}
指针实现
void mystrcpy1(char* str, const char* src) {
assert(str != NULL && src != NULL);
while (*src!='\0')
{
*str = *src;
str++;
src++;
}
*str = '\0';
}
void mystrcpy2(char* str, const char* src) {
assert(str != NULL && src != NULL);
while (*src != '\0')
{
*str++ = *src++; //*的优先级高于++,所以先解引用,在后置加加
}
*str = '\0';
}
void mystrcpy3(char* str, const char* src) {
assert(str != NULL && src != NULL);
while (*str++ = *src++);//为\0时,赋值之后,*str=‘\0’*str的Ascll为0,循环结束
}
mystrcmp
int my_strcmp( const char *lhs, const char *rhs );
数组实现
int my_strcmp1(char* str, char* src) {
int i = 0;
int res = 0;
while (str[i] == src[i]) {
if (str[i] == '\0')
{
break; //res =0 相等
}
i++;
}
if (str[i] != src[i]) {
res = str[i] > src[i] ? 1 : -1;
}
return res;
}
指针实现
int mystrcmp(const char* pstr, const char* psrc) {
if (pstr == NULL || psrc == NULL)return -2;
while (*pstr==*psrc)
{
if (*pstr == '\0')return 0;
pstr++;
psrc++;
}
int res = *pstr > *psrc ? 1 : -1;
return res;
}
mystrcat
连接两个字符串
char *my_strcat( char *dest, const char *src );
数组实现
void my_strcat1(char* arr, char* brr) {
assert(arr != NULL && brr !=NULL);
//断言 debug 版本下 release 失效
if (arr == NULL || brr == NULL)
return;
int lenarr = strlen(arr);
int lenbrr = strlen(brr);
int i = lenarr,j = 0; //i 遍历arr j brr
for (; j <= lenbrr; j++) {
arr[i] = brr[j];
i++;
}
}
void my_strcat2(char* arr, char* brr) {
assert(arr != NULL && brr != NULL);
//断言 debug 版本下 release 失效
if (arr == NULL || brr == NULL)
return;
int len = strlen(arr);
int j = 0;
while (brr[j]!='\0') {
arr[len+j] = brr[j];
j++;
}
arr[len + j] = '\0';
}
void my_strcat3(char* arr, char* brr) {
assert(arr != NULL && brr != NULL);
//断言 debug 版本下 release 失效
if (arr == NULL || brr == NULL)
return;
int len = strlen(arr);
int j = 0;
while (arr[len + j] = brr[j]) { //'\0'赋值完结束循环
j++;
}
}
指针实现
void mystrcat1(char* str, const char* src) {
assert(str != NULL && src != NULL);
while (*str != '\0')
{
str++;
}
while (*src!='\0')
{
*str = *src;
str++;
src++;
}
*str = '\0';
}
void mystrcat2(char* str, const char* src) {
assert(str != NULL && src != NULL);
while (*str++);//当*str为‘\0’时,会后置加加,所以需要减一次;
str--;
while (*str++ = *src++);
}