1. 程式人生 > >常見字串函式的實現過程

常見字串函式的實現過程

一、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));
}