常見字串函式的實現過程
阿新 • • 發佈:2019-02-17
一、strlen()函式
求字串長度,不包括 ‘\0’
unsigned int mystrlen( char *s )
{
unsigned int len=0;
while(*s != '\0')
{
s++;
len++;
}
return len;
}
二、字串追加函式strcat( ):
char *mystrcat(char *str1,char *str2)
{
char *p=str1;
while(*p) //把p指向最後,檢測到\0後退出while迴圈
p++;
while (*p++=*str2++); //空循壞
return str1;
}
這裡有一個對指標的操作技巧,因為字串結尾為’\0’(ASCII碼為 0),當*p=’\0’時退出while迴圈。while(*p++=*str2++); 在p的後面追加,一直到str2讀取到’\0’,*p=’0’;也可以用陣列的方法。
void mystrncat(char data[], char data1[], int n)
{
int len = strlen(data);
int len1 = strlen(data1);
int i;
for(i = 0; i < n && data1[i] != '\0' ; ++i)
{
data[len + i] = data1[i];
}
printf("%s\n", data);
}
三、字串比較函式strcmp( ):
比較是一個一個字元比較。比較ASCII碼的大小,比如,如果字串str1的第一個字元大於str2第一個字元,則str1>str2。
#include <stdio.h>
#include <string.h>
int mystrcmp(const char *s1, const char *s2)
{
int len1=strlen(s1);
int len2=strlen(s2);
int i;
for(i=0; i<=len1 && i<=len2; i++)
{
if(s1[i] > s2[i])
{
return 1;
}
if(s1[i] < s2[i])
{
return -1;
}
else if (s1[i] == s2[i])
{
return 0;
}
}
}
四、字串拷貝函式:strcpy( )
和追加不同的是,這裡是從str1起始地址開始,用str2覆蓋str1。
#include <stdio.h>
#include <string.h>
char *mystrcpy(char *dest, const char *src,int n)
{
int i;
char *p = dest;
if(*src ==' ')
{
printf("src is empty");
return 0;
}
for(i=0;i<n && src[i]!='\0';i++)
{
*(p+i)=*(src+i);
}
return dest;
}
五、字串擷取函式:strstr()
返回子串(data1)所在位置的首地址。
void mystrstr(char data[], char data1[])
{
char* index = NULL;
index = data; //主串
char* str1 = NULL;
char* str2 = NULL;
if(*data1 == '\0')
{
printf("The data1 is NULL!\n");
}
while(*index != '\0')
{
str1 = data;
str2 = data1;
while(*str1 != '\0' && *str2 != '\0' && (*str1 - *str2) == 0) //進入while以後,如果能夠找到,一直到*str1 !=*str2才會結束迴圈
{
str1++;
str2++;
}
if(*str2 == '\0') //檢測到str2結束才打印
{
printf("%s\n", index);
}
index++; //遍歷主串
}
}
核心程式碼:
#include <stdio.h>
size_t mystrlen(const char * s)
{
const char *sc;
for (sc = s; *sc != '\0'; ++sc)
/* nothing */;
return sc - s;
}
char *mystrcpy (char *dest,char *src)
{
char *temp = dest;
while( (*dest++ = *src++) != '\0' )
;
return temp;
}
char *mystrncpy (char *dest,char *src,size_t count)
{
char *temp = dest;
while ( count-- && (*dest++ = *src++) != '\0')
{
;
}
return temp;
}
char *mystrcat (char *dest,char *src)
{
char *temp = dest;
while (*dest)
{
dest++;
}
while ((*dest++ = *src++) != '\0')
{
;
}
return temp;
}
int mystrcmp(const char * cs,const char * ct)
{
register signed char __res; //定義在暫存器中的變數,CPU不必訪問記憶體,能很快的讀取
while (1) {
if ((__res = *cs - *ct++) != 0 || !*cs++)
break;
}
return __res;
}
int main()
{
char arr[10]="abcde";
char a[4]="ach";
char b[10];
printf("%d\n",mystrlen(arr));
//test for strcpy
// mystrcpy(b,arr);
// printf("%s\n",b);
//test for strncpy
// mystrncpy(b,arr,3);
// printf("%s\n",b);
// mystrcat(arr,a);
// printf("%s\n",arr);
printf("%d\n",mystrcmp(a,arr));
}