C語言字元char與字串差異與詳解 - CHG
文章推薦指數: 80 %
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
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
延伸文章資訊
- 1字元陣列與字串 - OpenHome.cc
字串就是一串文字,在C++ 談到字串的話,一個意義是指字元組成的陣列,最後加上一個空(null)字元 '\0' ,例如底下是個 "hello" 字串: char text[] = {'h', '...
- 2(原創) char s[]字串和char *s字串有什麼差別? (C/C++) (C)
C語言有兩種字串宣告方式char s[]和char *s,兩者有什麼差異呢? ... 的s是一個pointer指向char,由於"Hello World"本身就是一個string literal...
- 3c/c++中string与char的区别 - CSDN博客
在C语言中,string 是定义一个字符串,存储的是一段如“abcd”的数据,而且最后还有一个结束符'\0'; char 是定义一个字符,存储一个字符,占一个字节。
- 4[C語言_ 01] 字元陣列,字串傻傻分不清楚? - Medium
本篇文章會介紹C語言字元陣列和字串的區別,讓大家可以輕鬆玩C語言char[]的字串,那麼廢話不多說,我們就開始撰寫C語言吧! Photo by Fab Lentz on ...
- 5第9 堂課- 字串的基礎應用