1. 程式人生 > >C語言中有關字串的程式設計題

C語言中有關字串的程式設計題

(1)字串拷貝strcpy
特點:只能拷貝字串,遇到\0停止拷貝

char* MyStrcpy(char* dst,const char* src)
{

     assert(dst != NULL && src != NULL);
    char* dstaddr = dst;//如果要返回值,必須重新定義一個指標指向目標指標,然後返回定義的這個指標,因為本來的dst已經++走到末尾了
    while(*src != '\0')
    {
         *dst++ = *src++;
    }
    *dst = '\0';
    //while(*dst++ = *src++);或者只用這一句while就可以
return dstaddr; }

(2)實現memcpy拷貝
特點:對記憶體拷貝,可以拷貝任何內容,拷貝n個位元組

void * memcpy(void *dst,,const void * src,int n)
{
    assert(dst != NULL && src != NULL && n>0);
    char* d = (char*)dst;//必須強轉為其他型別,因為void*型別不能進行++操作
    char* s = (char*)src;
    while(n - -) 
    {
         *d++ = *s++;
    }
    return
dst;//為了實現鏈式操作,將目標地址返回,因為d++多次,所以不能返回d }

memcpy與memmove都可以進行對記憶體的拷貝,區別是如果兩個指標記憶體有重疊,memcpy可能不安全,memmove是安全的。

記憶體方面主要有三種情況:
第一種,記憶體不重疊,拷貝沒有問題
第二種,指標dst > src+n,從src前面開始拷,此時拷貝也不會有問題
第三種:src > dst,這種情況memcpy會出現問題。因為如果從src前面開始拷貝,會自己把自己的後面覆蓋掉。但是這種情況下memmove的處理方法是從後開始拷貝,所以比較安全。
這裡寫圖片描述

(4)實現memmove拷貝

void* memmove(void* dst,void* src,int n)
{
    assert(dst != NULL && src != NULL && n>=0);
    char *d = (char*)dst;//必須強轉為其他型別
    char* s = (char*)src;
    if(dst <= src || (char*)dst >= (cha*)src+n)//src在dst前面或者有重疊但不影響,正向拷
    {
         while(n - -)
         {
             *d++ = *s++;
         }
    }
    else
    {
         d = d+ n -1;//d指向後面,開始拷
         s = s+ n -1;
         while(n - -)
         {
             *d - - = *s - -;
         }
    }
    return dst;
}

(5)求字串長度

int Strlen(const char* str)
{
    assert(str != NULL);
    int len = 0;//初始化不能忘
    while(*str != '\0')
    {
         len++;
          str++;
    }
    return len;
}

(6)字串連線

char* Strcat(char* dst, const char*src)
{
     assert(dst != NULL && src != NULL);
     char * p = dst;
    while(*dst != '\0')
    {
         dst++;
    }
    while(*src != '\0')
    {
         *dst++ = *src++;
    }
    *dst = '\0';//不能忘
    return p;
}

(7)字串比較

int Strcmp(const char*str1,const char*str2)
{
    assert(str1 != NULL && str2 != NULL);
    int tmp = 0;
    while(((tmp = *str1-*str2) == 0) && *str1!='\0')
    {//字母相同繼續朝前走,只要遇到字母不一樣,不論是否遍歷完,都跳出
         str1++;
         str2++;
    }
    return tmp;
}

(8)字串逆置

char* StrReverse(char *str)
{
    char tmp;
    char* s = str;
    char *p = str;
    while(*p != '\0')
    {
         p++;
    }
    p - -;//while迴圈中p走到了\0位置,但是逆置時不能把\0也逆置了
    while(str < p)
    {

         tmp = *str;
         *str = *p;
         *p =tmp;
         p - -;
         str++;
    }
    return s;//為了實現鏈式操作,返回
}