天天看點

字元串的拷貝,有效長度,連接配接及大小比較(數組、指針)

這篇文章我們來學習一下字元串的一些操作:

(頭檔案已省略)

1.字元串的拷貝:

我們最開始想到的就是傳長度循環直接寫,把源字元串每個值指派給目的字元串,代碼如下:

int main()
{
    char str1[20]="hello world";
    char str2[20]="";
    for(int i=0;i<=sizeof(str1)/sizeof(str1[0]);i++)
    {
        str2[i]=str1[i];
    }
    printf("%s\n",str2);
        return 0;
}
           

顯然這樣一個程式來實作str1拷貝str1的“hello world”是完全沒問題的,但是我們來考慮一下,①我們如果不寫在一個主函數裡的話,我們考慮到sizeof(str1)/sizeof(str1[0])計算字元串長度這個公式它隻能在定義這個字元串的同一函數中使用的,想使用得傳參數,②其實根據字元串函數的性質:字元串使用“ ”(雙引号)包括起來的字元序列,後面再帶一個隐藏的‘\0’,‘\0’是字元串的結束為标志,沒有‘\0’就不能成為字元串。是以呀字元串中不用穿長度,因為‘\0’可以傳長度,找到\0不就知道字元串有多長,并且循環結束了。那我們利用這一性質來寫一下,代碼如下:

void Mystrcopy(char des[],const char src[])//des,src分别是destinate和source
{
    int i;
    for(i=0;src[i]!='\0';i++)
    {
        des[i]=src[i];
    }
    des[i]='\0';    //最後把‘\0’給加上
}
int main()
{
    char str1[20]="hello world";
    char str2[20]="";
    Mystrcopy(str2,str1);
    printf("%s\n",str2);
    return 0;
}
           

那麼如何使用指針實作呢?再來試試,代碼如下:

void Mystrcopy(char *des,const char *src)
{
    while(*src!='\0')
    {
        *des=*src;
        src++;
        des++;
    }
    *des='\0';
}
int main()
{
    char str1[20]="hello world";
    char str2[20]="";
    Mystrcopy(str2,str1);
    printf("%s\n",str2);
    return 0;
}
           

這裡已經用不到i來循環了,直接是移動指針很好了解 *des=*src;分别是源和目的的解引用和指派,跟des[i]=src[i];一個作用,隻不過前者靠的是指針的移動來一步一步走後者是移動指針。

到這裡,除了for(int i=0;str[i]!= ‘\0’;i++) while(*str != ‘\0’) 兩個方法,字元串拷貝還有一個經典代碼:while(*des++ = *src++) ;

:後面的分号不能少!!!否則會報錯,你後面沒寫語句啊,加了分号證明我知道後面有語句,沒事,我就是要這個語句是空的,我知道。這裡++和星号的運算優先級是一樣的,這時我們就要看結合性了,他們的結合性是從右向左,這又是後置加加。是以得以實作。

2.字元串的有效長度:

我們上面說了,*字元串使用“ ”(雙引号)包括起來的字元序列,後面再帶一個隐藏的‘\0’,我們還是用這個來寫代碼做判斷了,那我們現在寫函數計算一個字元串的有效長度,我們到底把這個0算進去還是不算進去呢?這肯定是有規定了,我們不能自己擅自改啊,這個時候就得去看看庫函數strlen它到底是怎麼對待了?

字元串的拷貝,有效長度,連接配接及大小比較(數組、指針)

很顯然,庫函數對字元串有效長度的處理沒有算‘\0’進去。那我們自然也不要算了。那就開始寫咯,代碼如下:

這個是利用了數組的索引循環:

int Mystrlen(const char str[])
{
    int i;
    for(i=0;str[i]!='\0';i++)
    {
        ;
    }
    return i;
}
int main()
{
    char str[20]="changzheng";
    printf("%d\n",Mystrlen(str));
    return 0;
}
           

這個是利用了數組:

這裡的i其實是個計數器的作用

int Mystrlen(const char *str)
{
    int i=0;
    while(*str!=0)
    {
        i++;
        str++;
    }
    return i;
}
int main()
{
    char str[20]="changzheng";
    printf("%d\n",Mystrlen(str));
    return 0;
}
           

3.字元串的連接配接:

首先得考慮,這兩個字元串怎麼連接配接呢?比如有str1,str2,想把2接在1後面成了一個全新的1。當然,在1數組空間足夠的情況下!這裡還是離不開‘\0’啊!想想看,這裡有兩個字元串,我們是不是應該先找1的結尾,找到結尾然後把2’補上去","補"字不就是拷貝呗!!這樣,這個過程就明了了。代碼如下:

void Mystrcat(char*des,char*src)
{
    while(*des!='\0')//這裡是不要‘\0’的
    {
        des++;
    }
    while(*src!='\0')
    {
        *des=*src;
        des++;
        src++;
    }
    *des='\0';
    
}
int main()
{
    char str1[50]="Long March";
    char str2[]=" always on way!";
    Mystrcat(str1,str2);
    printf("%s\n",str1);
}
           

4.字元串的大小比較(這裡不是長度的比較)

比較的時候,從字元串左邊開始,一次比較每個字元,直接出現差異、或者其中一個串結束為止。

int Mystrcmp(char *str1,char *str2)
{
     if(str1==str2)
    {
        return 0;
    }
    if(*str1!=*str2)
    {
        return *str2-*str1;
    }
    while(*str1==*str2)
    {
        str1++;
        str2++;
    }
      return *str2-*str1;
}
int main()
{
   printf("%d\n",Mystrcmp("abd","abcd"));
	printf("%d\n",Mystrcmp("abc","x"));
	printf("%d\n",Mystrcmp("abce","abcd"));
	printf("%d\n",Mystrcmp("abcd","abcd"));   //各種情況都要試試!
    return 0;
}
           

這次就是這些内容,希望大家看到了,互相學習,有問題也希望指出來!

字元串的拷貝,有效長度,連接配接及大小比較(數組、指針)

這是…今日配圖!?

繼續閱讀