1. 程式人生 > >字元陣列的學習總結

字元陣列的學習總結

今天主要講了兩點,一是字元陣列的定義,二是字元陣列的拷貝,也是重點。


一、字元陣列的定義

char arr[5] = {'a','b','c','d','e'};
char brr[5] = {'a','b','c'};           //聚合型別,只初始化部分,剩餘部分為0('\0')
char crr[] = {'a','b','c','d','e'};
char drr[5];

以上等同整型陣列


char err[5] = {"abc"};//利用字串初始化

char frr[5] = "abc";


char grr[5] = "abcde";//error, 這個定義是錯誤的,是因為如果字串後面還有一個'\0',長度一共為6,而定義的陣列長度是5。字串一定以'\0'結尾,這個字元是看不見的。
'\0'是字串結尾標記,只要是字串一定有'\0', 只要遇到'\0'就認為字串結束。


二、如何進行字串拷貝

首先定義三個字元陣列str1,str2,str3。

char str1[100]="abcd";

char str2[100]="xyz";

char str3[100];

現在想把str1數組裡面元素複製到str3裡面。如何實現呢?


1.str3=str1;這樣可以嗎?很明顯是不行的,因為陣列不能整體複製。


2.建立一個函式Mystrcpy1(),如下:

void Mystrcpy1(char *str1,char *str2)      //str1=str2

{

int i;

for(i=0;str[i]!='\0';i++)                    //從首元素開始複製,直到元素為'\0'時停止。

{

str1[i]=str2[i];

}

str1[i]='\0';                               //最後再加一個'\0'

}

然後在主函式中呼叫函式Mystrcpy1(),如下:

int main()

{

char str1[100]="abcd";

char str2[100]="xyz";

char str3[100];

Mystrcpy1(str3,str1);       //呼叫函式

printf("%s\n",str3);//輸出,成功複製

return 0;

}


3.由於上節課學過,陣列和指標可以互相轉化,如下:

*(arr+i)==arr[i]         等價 

p[i]==*(p+i)             等價

所以對上一個函式進行換一個形式,結果如下:

void Mystrcpy2(char *str1,char *str2)      //str1=str2

{

int i;

for(i=0;*(str1+i)!='\0';i++)                    //從首元素開始複製,直到元素為'\0'時停止。

{

*(str1+i)=*(str2+i);

}

*(str1+i)='\0';                               //最後再加一個'\0'

}

主函式再呼叫,成功複製。因為跟上面是同理,所以此處和後面主函式省略不寫。

4.現在想把函式寫得更簡單一點,可以這樣寫:

void Mystrcpy3(char *str1,char *str2)
{
while(*str2 != '\0')
{
*str1 = *str2;
str1++;
str2++;
}
*str1 = '\0';
}
           這樣就少定義一個變數i,由於改變指標來複制元素,需要用到解引用。


5.把函式寫得更簡單一點,可以這樣寫:

void Mystrcpy4(char *str1,char *str2)
{
while(*str2 != '\0')//2
{
*str1++ = *str2++;
}
*str1 = '\0';
}


6.史上最簡單的字元陣列複製函式如下:

void Mystrcpy5(char *str1,char *str2)
{
while(*str1++ = *str2++) ;
}

這個函式的優點是簡單,省記憶體,缺點是可讀性差。但是最優選擇還是這個函式。

7.上面的5個函式都是無返回值的,假如需要用到返回值的話,如下:

char * Mystrcpy(char *des,char *src)//des = src
{
char *p = des;
while(*des++ = *src++) ;
return p;
}

在主函式中

Mystrcpy(str4, Mystrcpy(str3,str2));//鏈式表達,老師說這是一個歷史遺留問題,也就是現在基本上不用了,因為看起來不容易理解。 

現在這樣寫:

Mystrcpy(str3,str2);
Mystrcpy(str4,str2);

所以基本上用不到有返回值的函式。

bingo!