|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2006-08-23, 04:27 PM | #1 |
註冊會員
|
疑問 - C 語言之字元與字串的疑問
請教各位C語言高手,小弟我對於char 這部份有地方不是很了解..請各位高手能否給我解答?
int i; i=5; 可以改寫成 int i=5; 但是為什麼在char 中字元可以使用這方法,但字串卻不行。 char i; i='A'; 可寫成 char i='A'; 例: char j[100]="Hello"; char j[100] ; j[100]="Hello"; 為什麼不可改寫成這種模式,字串一定不能換行敘述嗎? |
送花文章: 0,
|
2006-08-23, 04:34 PM | #2 (permalink) | |
註冊會員
|
引用:
這跟陣列的概念有關 j[100]=是一個字元啊 他長度只有一個byte Hello要五個byte當然放不進去囉 另外j的長度是100byte 從j[0]-[99] j[100]已經超過陣列長度囉 C語言沒有字串這種原生型態的 |
|
送花文章: 623,
|
2006-08-23, 05:34 PM | #4 (permalink) | |
註冊會員
|
引用:
char j[100]="Hello"; 這行是合法的 不過這算是編譯器給你一個方便 意義是將"hello"放進j陣列裡面 可是j[100]代表的是陣列裡面其中一個cell 所以你只能放進一個字元 比如'h' 編譯器並沒有問題喔 問題是出在兩航的j[100]代表不同的意義 第一行的j[100]是代表整個j陣列 第二行的j[100]是代表j陣列裡面其中一個cell 陣列在宣告句與敘述句有不同的意義喔 指標也是如此 int *p=&a; 與 *p=5; *p是完全不同的意義喔 如有問題歡迎討論 msn : power0818@msn.com 此帖於 2006-08-23 08:50 PM 被 snoopy 編輯. |
|
送花文章: 623,
|
2006-08-23, 08:36 PM | #5 (permalink) |
管理員
|
我的解釋
------------------------------------------------------- int I; I = 5; 可以改寫成 int I = 5; 是因為 int 是整數宣告,以 DEV-C++ 的 int 整數是佔用 4 Bytes 可以表示數值範圍是 2147483647 ~ -2147483648 的範圍 而古老的 Turbo-C 的 int 整數是佔用 2 Bytes 可以表示數值範圍是 32767 ~ -32768 當 I = 5; 是把 I 的數值指定成 5,並未超過 int 的數值範圍, 所以OK。 ------------------------------------------------------- char I; I = 'A'; 可以改寫成 char I = 'A'; 是因為 char 是字元宣告,以 DEV-C++ 的char 是字元是佔用 1 Bytes 以數值的表示範圍是 0 ~ 255,也是 ASCII 的範圍所在 (ASCII 碼是 0 ~127) 當 I = 'A'; 是把 I 的數值指定成 65 既是 A 字元,並未超過 char 的數值範圍,所以OK。 而 A 的 ASCII 碼的值為 65 剛好是 1 Bytes 的大小故可以。 一個英文字母或符號(半形)使用 1 Bytes 來表示,但是全形符號 就佔用 2 Bytes。 此外 I = 5; 跟 I = '5'; 是完全不一樣的 I = 5; 給是數值的 5 I = '5'; 給是字元的 5 (ASCII 碼為 53) ------------------------------------------------------- char J[100] = "Hello"; 一開始宣告 J[100] 並給予初值 "Hello"; 因為 char J[100] 指的是 J 字元變數陣列容量有 100 個字元, 編號從 J[0] ~ J[99] 共佔 100 Bytes,當 J[100] = "Hello"; 是依序從 J[0] 開始放自元把 Hello 放完並在最後自動補上 '\0' 示意如下︰ 以自元來看是 J[0]='H',J[1]='e',J[2]='l',J[3]='l',J[4]='o',J[5]='\0' 如果是 ASCII 碼 J[0]=72, J[1]=101,J[2]=108,J[3]=108,J[4]=111,J[5]=0 '\0' 在 C/C++ 中表示字串得結尾,表示該字串到該自元結束。 所以 J[100] = "Hello"; 的 J 用了 100 Bytes 但是 "Hello"; 在這 J 變數中只用了 6 Bytes 當下達 cout << J; 是把整個 J 印出來,固畫面得到 Hello, 但是 cout << J[1]; 是把 J[1] 的位置內的字元印出來,固畫面得到 e。 但是 char J[100]; J[100] = "Hello"; 就不行了,因為 char J[100]; 之前解釋過了,但是 J[100] = "Hello"; 此時就錯了因為 J[100] = "Hello"; 的 J[100] 是指 J 的 第101個位置 ,而且只能給一個字元。 實際上 char J[100]; 後的 J 範圍是從 0 ~ 99 共 100 個,既是 J[0] ~ J[99] 那 J[100]可是會只到別的記憶體位置,導致程式出錯的。 這時只好一個字元個字元給︰ char B[100]; B[0] = 'H'; B[1] = 'e'; B[2] = 'l'; B[3] = 'l'; B[4] = 'o'; B[5] = '\0'; 才能給進去。給字元的時候一定要用 'H' 而不是 "H",因為 '' 表示是裡面是字元,"" 表示字串,此外'Hw'時,也些編譯 器會只抓 H 或是 w 所以 '' 以一個半形符號為安全。 除了一個一個字元給之外,可以用字串函數 strcpy(); 來解決 語法 strcpy(目的,來源); 例 : char C[100]; strcpy(C,"Hello"); 這樣就行了,字串函數 strcpy(); 是標頭檔 string.h 裡的函數指令 要用 strcpy(); 時加在以下的地方: #include <stdio.h> #include <string.h> |
__________________ 在「專業主討論區」中的問題解決後,要記得按一下 按鈕喔, 這是一種禮貌動作。 一樣是在「專業主討論區」中發問,不管問題解決與否,都要回應別人的回答文喔。 不然搞 [斷頭文],只看不回應,下次被別人列入黑名單就不要怪人喔。 天線寶寶說再見啦~ ... 天線寶寶說再見啦~ 迪西:「再見~ 再見~」 『 Otaku Culture Party 』 關心您 ... |
|
送花文章: 37855,
|