字元陣列的學習總結
今天主要講了兩點,一是字元陣列的定義,二是字元陣列的拷貝,也是重點。
一、字元陣列的定義
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 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!