C語言字元char與字串差異與詳解 - CHG

文章推薦指數: 80 %
投票人數:10人

C語言字元char與字串差異與詳解. tags: C++ Concept2. 初學C語言的時候遇到字串總是感到莫名其妙與不知道該怎麼用,比如說為什麼字串不能直接接上,或 ... 2017年4月9日星期日 C語言字元char與字串差異與詳解 C語言字元char與字串差異與詳解 tags:C++Concept2 初學C語言的時候遇到字串總是感到莫名其妙與不知道該怎麼用,比如說為什麼字串不能直接接上,或直接相等置換等等問題,大致列舉了一些常見的錯誤與解法。

常見的困惑 容易誤會的點,把字串當作型態,實際上字串是字元的陣列 intarr[3],arr2[3]; arr1=arr2; 陣列的指派是不可行的,卻很容易把字串的指派,當作是可行的踩了坑 char*s="123\0"; chars2[4]; s2=s; 字串的指派是不可行的,不過反過來s=s2倒是可以。

還有一個很有趣的題型 chars[]="123\0"; printf("%s\n",s); printf("%s\n",&s); 他們居然打印出一樣的結果!待會還是會提到,下面就開始提提有哪些該注意的地方,這都是指針與陣列的誤區。

指標與陣列的關係與差異 隱式轉換 陣列是陣列、指標是指標 只不過在大多數的時候陣列會自動轉換成指標,操作起來就像個指標一樣。

具體差異在哪裡,並不太容易敘述清楚,下面會簡單的舉個例子說明不可互相替代。

指標宣告與陣列宣告 一般來說常數是存在唯讀記憶體內,比如說一個副程式的呼叫“ABC\0”返回的型態是char*一個指向"ABC\0"的A的地址 fun("ABC\0"); 那個”ABC”不能夠被更動,是帶const屬性的,宣告的時候也一樣這裡可以視為把char*賦值給char*是可執行的 char*str="ABC\0"; 這樣子的方式會建立暫存,並返回指標,讓str指向那個暫存的唯讀空間所以當你嘗試修改他時,是非法的。

str[0]='0'; 如果我們使用字串的話則會不同的情況發生 charstr[]="123\0"; 創建一個陣列,並將其內容初始化,這種情況下我們才可以正常的存取,從這裡可以看出來,除非你很確定我不會動到他,否則還是盡量使用 charstr[]; 避免自己採坑了,設定成指標之後不小心修改到發生非法存取 指標與陣列的差異也可以從sizeof上看出區別 int*num; intarr[3]; printf("%d\n",(int)sizeof(num));//64bitsize8 printf("%d\n",(int)sizeof(arr));//size4*3=12 一個陣列可以獲取實際長度,轉為指標後則不可獲取 sizeof(arr)/sizeof(arr[0]) 陣列的地址 經過以上大致敘述了陣列與指針的差異的,其中還有一個就是陣列也是可以取址的! 回頭來看看剛剛那一題,或許你已經想到是怎麼回事了 chars[]="123\0"; printf("%s\n",s); printf("%s\n",&s); 這裡第一個s返回的是陣列起始的位址,型態為char*,這裡會發生一次隱式轉型,編譯器自作主張的將陣列char(*)[4]轉為指針char*型態; 第二個&s指的是對一個陣列char(*)[7]取址,而它的地址恰好與陣列的起始位置相等,型態一樣是char(*)[4]。

printf接收到兩個相等的位置,自然會打印出兩個一樣的結果。

另外要記住對一個位址取址是非法的。

為什麼不能直接相等傳遞 charstr1[]="ABC\0"; charstr2[]="DEF\0"; str1=str2;//Error 就像整數陣列一樣沒辦法直接等號過去,很容易誤把字串當成是一種變數叫字串,實際上他是字元的陣列;換個方式寫你可能就有感覺了 intarr1[]={1,2,3}; intarr2[]={3,2,1}; arr1=arr2;//Error 另外這裡也可以看出陣列與指標的不同之處 intarr1[]={1,2,3}; int*p1=NULL; p1=arr1;//isok 只能利用for迴圈一個一個搬移過去 char*str1="ABC\0"; charstr2[4]; for(inti=0;i<4;++i){ str1[i]=str2[i]; } printf("%s\n",str2); 你也可以使用內建的函式搬移 #include #include intmain(){ charstr1[]="Samplestring"; charstr2[40]; charstr3[40]; strcpy(str2,str1); strcpy(str3,"copysuccessful"); printf("str1:%s\nstr2:%s\nstr3:%s\n",str1,str2,str3); return0; } 為什麼不能用+的 同上原因,陣列也沒辦法直接用加的,除此之外還要注意一個問題,長度是否足夠容下相加後 charstr1[]="ABC"; charstr2[]="ABC"; 上述的作法長度會是3+1,可是相加後他們會變成6+1,你必須有一個足夠長的陣列,比如說將第二個長度拉長兩倍;這裡的+1是結束符。

charstr1[]="ABC"; charstr2[7]="ABC"; str2[3]=str1[0] str2[5]=str1[1] str2[4]=str1[2] 字串的相接也有函式可以使用 strcat(str2,str1); 字串殘留上一次的字元、清空與初始化字串 比如說這樣的範例,試圖讓副函式操作字串 /***************************************************************** Name: Date:2017/04/08 By:CharlotteHonG Final:2017/04/08 *****************************************************************/ #include #include #include voidfun(char*str,char*str2){ for(inti=0;i



請為這篇文章評分?