模擬實現:strlen,strcpy,strcat,strchr,ctrcmp,strstr
阿新 • • 發佈:2018-12-22
模擬實現幾個str庫函式的功能:
首先,應用的標頭檔案如下:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
主函式如下,為了觀察結果更加清晰,我在程式碼裡順便分了一下顯示區域,並且每個模擬實現的函式都與其對應的庫函式結果進行了對比:
int main() { char str1[] = { "abcdef" }; char str2[30] = { "0" }; char str3[30] = { "123456" }; printf("str1=%s\nstr2=%s\nstr3=%s\n",str1,str2,str3); printf("************************************************\n"); //My_strlen(str1); printf("My_strlen:\nMy_strlen1(str1):len(str)=%d\n", My_strlen1(str1)); printf("My_strlen2(str1):len(str)=%d\n", My_strlen2(str1)); printf("My_strlen3(str1):len(str)=%d\n", My_strlen3(str1)); printf("strlen(str1):len(str)=%d\n", strlen(str1)); printf("************************************************\n"); //My_strcpy(str2, str1); printf("My_strcpy:\nMy_strcpy(str2,str1):str2=%s\n", My_strcpy(str2, str1)); printf("strcpy(str2,str1):str2=%s\n", strcpy(str2, str1)); printf("************************************************\n"); //My_strcat(str3, str1); printf("My_strcat:\nMy_strcat(str3,str1):str3=%s\n", My_strcat(str3, str1)); printf("strcat(str3,str1):str3=%s ", strcat(str3, str1)); printf("(在My_strcat的結果的基礎上再進行一次strcat!)\n"); printf("************************************************\n"); //My_strstr(str1,"bcd"); printf("My_strstr:\nMy_strstr(str1,'bcd'):%s\n", My_strstr(str1, "bcd")); printf("strstr(str1,'bcd'):%s\n", strstr(str1, "bcd")); printf("************************************************\n"); //My_strchr(str1,'d'); printf("My_strchr:\nMy_strchr(str1, 'd'):%s\n", My_strchr(str1, 'd')); printf("My_strchr(str1, 'd'):%s\n", My_strchr(str1, 'h')); printf("strchr(str1, 'h'):%s\n", strchr(str1, 'd')); printf("strchr(str1, 'h'):%s\n", strchr(str1, 'h')); printf("************************************************\n"); //My_strcmp(str1,str3); printf("My_strcmp:\nMy_strcmp(str1,str3):%d\n", My_strcmp(str3, str1)); printf("My_strcmp(str1,str3):%d\n", My_strcmp(str1, str3)); printf("My_strcmp(str1,str3):%d\n", My_strcmp(str1, str2)); //str2已被修改,此時str2=str1 printf("strcmp(str1,str3):%d\n", strcmp(str3, str1)); printf("strcmp(str1,str3):%d\n", strcmp(str1, str3)); printf("strcmp(str1,str3):%d\n", strcmp(str1, str2)); //str2已被修改,此時str2=str1 printf("************************************************\n"); system("pause"); return 0; }
各部位程式碼:
1·strlen(求字串長度,這裡用了三種不同的方法):
int My_strlen1(char *str) //方法1:計數器求strlen { assert(str); int count = 0; while (*str) { count++; str++; } return count; } int My_strlen2(char *str) //方法2:遞迴方法求strlen { assert(str); if (*str == '\0') return 0; else return 1 + My_strlen2(str+1); } int My_strlen3(char *str) //方法3:尾指標-頭指標方法求strlen { assert(str); char *p = str; while (*p != '\0') { p++; } return p - str; }
2·strcpy(字串拷貝):
char *My_strcpy(char *dst, const char *src)
{
assert(dst);
assert(src);
char *ret = dst;
/*while (*dst=*src)
{
dst++;
src++;
}*/
while (*dst++ = *src++)
{
;
}
//稍作改進
return ret;
}
3·strcat(字串追加):
char *My_strcat(char *dst, const char *src) { assert(dst); assert(src); char *ret = dst; while (*dst) { dst++; } while (*src) { *dst =*src; src++; dst++; } return ret; }
4·strstr(子字串查詢):
char *My_strstr(const char *str1, const char *str2)
{
assert(str1);
assert(str2);
char *p_str1 = (char *)str1;
char *p_str2 = (char *)str2;
char *pc_str1=NULL;
if (*str2=='\0')
{
return NULL;
}
while (*p_str1)
{
pc_str1 = p_str1;
p_str2 = (char *)str2;
while ((*pc_str1 == *p_str2)&&(*p_str2)&&(*pc_str1))
{
pc_str1++;
p_str2++;
}
if (*p_str2 == '\0')
{
return p_str1;
}
p_str1++;
}
return NULL;
}
5·strchr(字元查詢):
char *My_strchr(char *str, int p) //字元可轉為ASCLL值,故引數2可為int型別
{
assert(str);
assert(p);
char *ret = str;
while (*str)
{
if (*str == p)
return str;
else
str++;
}
return NULL;
}
6.strcmp(字串比較):
int My_strcmp(const char *str1, const char* str2)
//若引數1>引數2,返回1;若引數1<引數2返回-1;若相等,返回0
{
assert(str1);
assert(str2);
while (*str1)
{
if (*str1 == *str2)
{
str1++;
str2++;
}
else
break;
}
if ( (*(unsigned char *)str1 - *(unsigned char *)str2) > 0)
return 1;
else if ((*(unsigned char *)str1 - *(unsigned char *)str2) < 0)
return -1;
return 0;
}
顯示結果如下:
經過驗證,功能與庫函式功能基本一致。