史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2006-08-23, 04:27 PM   #1
hardlike
註冊會員
榮譽勳章

勳章總數
UID - 20022
在線等級: 級別:6 | 在線時長:61小時 | 升級還需:16小時
註冊日期: 2002-12-31
VIP期限: 2007-03
文章: 95
精華: 0
現金: 695 金幣
資產: 695 金幣
預設 疑問 - 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";
為什麼不可改寫成這種模式,字串一定不能換行敘述嗎?
hardlike 目前離線  
送花文章: 0, 收花文章: 0 篇, 收花: 0 次
回覆時引用此帖
舊 2006-08-23, 04:34 PM   #2 (permalink)
註冊會員
 
snoopy 的頭像
榮譽勳章
UID - 33737
在線等級: 級別:49 | 在線時長:2676小時 | 升級還需:24小時級別:49 | 在線時長:2676小時 | 升級還需:24小時級別:49 | 在線時長:2676小時 | 升級還需:24小時級別:49 | 在線時長:2676小時 | 升級還需:24小時
註冊日期: 2003-02-02
VIP期限: 2011-06
住址: 台南共和國
文章: 1831
精華: 0
現金: 12744 金幣
資產: 12834 金幣
預設

引用:
作者: hardlike
可寫成 char i='A';

例: char j[100]="Hello";

char j[100] ;
j[100]="Hello";
為什麼不可改寫成這種模式,字串一定不能換行敘述嗎?[COLOR...
當然不行囉
這跟陣列的概念有關
j[100]=是一個字元啊
他長度只有一個byte
Hello要五個byte當然放不進去囉

另外j的長度是100byte
從j[0]-[99]
j[100]已經超過陣列長度囉

C語言沒有字串這種原生型態的
snoopy 目前離線  
送花文章: 623, 收花文章: 392 篇, 收花: 1288 次
回覆時引用此帖
舊 2006-08-23, 05:06 PM   #3 (permalink)
註冊會員
榮譽勳章

勳章總數
UID - 20022
在線等級: 級別:6 | 在線時長:61小時 | 升級還需:16小時
註冊日期: 2002-12-31
VIP期限: 2007-03
文章: 95
精華: 0
現金: 695 金幣
資產: 695 金幣
預設

非常感謝樓上大大的解答,但是我用 char j[100]="Hello";確實是可以跑出結果,可是換行敘述的話就不行 PS.我是用DEV-C++編譯的
hardlike 目前離線  
送花文章: 0, 收花文章: 0 篇, 收花: 0 次
回覆時引用此帖
舊 2006-08-23, 05:34 PM   #4 (permalink)
註冊會員
 
snoopy 的頭像
榮譽勳章
UID - 33737
在線等級: 級別:49 | 在線時長:2676小時 | 升級還需:24小時級別:49 | 在線時長:2676小時 | 升級還需:24小時級別:49 | 在線時長:2676小時 | 升級還需:24小時級別:49 | 在線時長:2676小時 | 升級還需:24小時
註冊日期: 2003-02-02
VIP期限: 2011-06
住址: 台南共和國
文章: 1831
精華: 0
現金: 12744 金幣
資產: 12834 金幣
預設

引用:
作者: hardlike
非常感謝樓上大大的解答,但是我用 char j[100]="Hello";確實是可以跑出結果,可是換行敘述的話就不行 PS.我是用DEV-C++編譯的

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 編輯.
snoopy 目前離線  
送花文章: 623, 收花文章: 392 篇, 收花: 1288 次
回覆時引用此帖
舊 2006-08-23, 08:36 PM   #5 (permalink)
管理員
 
getter 的頭像
榮譽勳章
UID - 6433
在線等級: 級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時
註冊日期: 2002-12-08
住址: 天線星球
文章: 8157
精華: 0
現金: 19955 金幣
資產: 765391 金幣
預設

我的解釋
-------------------------------------------------------
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>
__________________
在「專業主討論區」中的問題解決後,要記得按一下 http://forum.slime.com.tw/images/stamps/is_solved.gif 按鈕喔,
這是一種禮貌動作。

一樣是在「專業主討論區」中發問,不管問題解決與否,都要回應別人的回答文喔。
不然搞 [斷頭文],只看不回應,下次被別人列入黑名單就不要怪人喔。

天線寶寶說再見啦~ ... 天線寶寶說再見啦~

迪西:「再見~ 再見~」

Otaku Culture Party 關心您 ...
getter 目前離線  
送花文章: 37855, 收花文章: 6441 篇, 收花: 26052 次
回覆時引用此帖
舊 2006-08-24, 02:24 AM   #6 (permalink)
註冊會員
榮譽勳章

勳章總數
UID - 20022
在線等級: 級別:6 | 在線時長:61小時 | 升級還需:16小時
註冊日期: 2002-12-31
VIP期限: 2007-03
文章: 95
精華: 0
現金: 695 金幣
資產: 695 金幣
預設

謝謝各位的解答,小弟我有一點懂了
是不是要用陣列的觀念來敘述字串可以有兩種表示法:
第一: char j[100]="hello";
第二: char j[100];
j[0]='h';
j[1]='e';
j[2]='l';
j[3]='l';
j[4]='o';
j[5]='\o';
這兩種語法得到的結果都是一樣的,不知道這樣的觀念對嗎?
hardlike 目前離線  
送花文章: 0, 收花文章: 0 篇, 收花: 0 次
回覆時引用此帖
舊 2006-08-24, 02:31 AM   #7 (permalink)
註冊會員
 
snoopy 的頭像
榮譽勳章
UID - 33737
在線等級: 級別:49 | 在線時長:2676小時 | 升級還需:24小時級別:49 | 在線時長:2676小時 | 升級還需:24小時級別:49 | 在線時長:2676小時 | 升級還需:24小時級別:49 | 在線時長:2676小時 | 升級還需:24小時
註冊日期: 2003-02-02
VIP期限: 2011-06
住址: 台南共和國
文章: 1831
精華: 0
現金: 12744 金幣
資產: 12834 金幣
預設

引用:
作者: hardlike
謝謝各位的解答,小弟我有一點懂了
是不是要用陣列的觀念來敘述字串可以有兩種表示法:
第一: char j[100]="hello";
第二: char j[100];
j[0]='h';
j[1]='e';
j[2]='...
恩可以這麼說
snoopy 目前離線  
送花文章: 623, 收花文章: 392 篇, 收花: 1288 次
回覆時引用此帖
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 10:20 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1