作者 主題: C語言的char array?  (閱讀 18788 次)

0 會員 與 1 訪客 正在閱讀本文。

Quota

  • 活潑的大學生
  • ***
  • 文章數: 352
    • 檢視個人資料
    • http://home.kimo.com.tw/jiannrongkimo/
C語言的char array?
« 於: 2007-12-19 17:12 »
請問以下的C語言:
#include <dos.h>
#include <stdlib.h>
main()
{
      char s1[6]="abcde1";
      int i=0;   
      for  (i=0;i<=6;i++)
      {
        printf("s1[%d]=%c\n",i,s1);
           }
      printf("s1=%s \n",s1);
      system("PAUSE");
      return 0;
}
執行之後得到的結果如下:
s1[0]=a
s1[1]=b
s1[2]=c
s1[3]=d
s1[4]=e
s1[5]=1
s1[6]=F
s1=abcde1FC?|?"
請按任意鍵繼續 . . .

為什麼
printf("s1=%s \n",s1);
不能得到abcde1
而是印出一堆奇怪的文字呢?

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5396
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
回覆: C語言的char array?
« 回覆 #1 於: 2007-12-19 17:43 »
你忘了 \0 嗎?
少一個 byte 來存 \0, 任何不正常的結果, 都是正常的.

螢火飛

  • 酷!學園 學長們
  • 活潑的大學生
  • ***
  • 文章數: 400
    • 檢視個人資料
    • http://firefly.idv.tw
回覆: C語言的char array?
« 回覆 #2 於: 2007-12-19 21:01 »
除了 twu2 說的之外,你的 for 迴圈也有問題,請自行算一下這個迴圈跑了幾次,而你的字串陣列又有多長。

試作三杯雞

  • 可愛的小學生
  • *
  • 文章數: 11
    • 檢視個人資料
    • http://mmpo.pcadsl.com
回覆: C語言的char array?
« 回覆 #3 於: 2007-12-19 22:35 »
char s1[]="abcde1";
改成這樣應該就可以跑了吧!..
字串後面有個'\0'當結尾,實際的記憶體數量是7才對

#include <stdio.h>
#include <stdlib.h>

int main(){
      char s1[]="abcde1";
      int i=0;   

      for  (i=0;i<=6;i++) {
        printf("s1[%d]=%c\n",i,s1);
           }
      printf("s1=%s \n",s1);
      system("PAUSE");
      return 0;
}

Quota

  • 活潑的大學生
  • ***
  • 文章數: 352
    • 檢視個人資料
    • http://home.kimo.com.tw/jiannrongkimo/
回覆: C語言的char array?
« 回覆 #4 於: 2007-12-19 23:14 »
不好意思
我想再確認一下
char s1[6]="abcde1";
是不是代表他有六個問題
儲存的資料由s1[0]到s1[5]?
因為我的for迴圈可以看到這樣的內容顯示
只是
為何我想要把s1 printf 除了abcde1 還會跑出其他資料?
因為我只是想要把s1這一個陣列輸出
為何會有其他字出現?
還是
s1[6]只能存5個,最後一個是存結束符號?
那再請問..
這是c語言陣列的特性嗎?
這是我不懂的地方
謝謝

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
回覆: C語言的char array?
« 回覆 #5 於: 2007-12-19 23:44 »
char s1[]="abcde1";

s[0] ==> 'a'
s[1] ==> 'b'
s[2] ==> 'c'
s[3] ==> 'd'
s[4] ==> 'e'
s[5] ==> '1';

至於你使用該語法:

char s1[6]="abcde1";

這算是錯誤的,因為光是 abcde1 就佔用了 6 個字元,字串本身是需要加上 '\0' 字元為結束,所以你宣告 6 個字元空間根本放不進去。所以不確定請這樣宣告:

char s1[]="abcde1";

使用上也應該是:

for(i=0;i<6;i++) { ....}

或者是多利用 sizeof() 取得該陣列空間:

for(i=0;i<sizeof(s1);i++) { .... }

若您的 s1 是指標這類,請改用 strlen() 這類函數呼叫取得長度即可。

建議還是多看一下基本 c language 的書有幫助。

--
« 上次編輯: 2007-12-19 23:47 由 kenduest »
I am kenduest - 小州

my website: http://kenduest.sayya.org/

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
回覆: C語言的char array?
« 回覆 #6 於: 2007-12-20 20:03 »
C語言的字串結尾都必須有個'\0'絕對不要忘了他的存在

利用這個特性搭配指標定位到空間中每一個'\0'的位址以後就可以寫一個不定長度的二維字串陣列

然後再定位每一個二維的指標陣列就是不定長度的三維字串陣列

有四維的嗎??應該可以!不過沒試過 :P

還有...計數是從0開始...0也是一個數...所以第0個也就是第1個...

沒有第-1個的,除非有特殊需要(但不能是實體上的第0個)比如可以把第9個當成是第0個就可以用第-1個了(不過很危險)

又跑題了~_~

« 上次編輯: 2007-12-20 20:15 由 stlee »
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

elleryq

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 908
  • 性別: 男
    • 檢視個人資料
    • Thinking more...
回覆: C語言的char array?
« 回覆 #7 於: 2007-12-21 09:45 »

再來離題...
pascal 內部對字串的處理,則是第一個元素放字串長度,因此當讀完第一個元素,就知道要配置多少空間給這個字串
由於這個特性,pascal 字串常被用於網路或是I/O的處理,因為可以避免要讀到 '\0' 才知道要配置多少空間的問題。
Plan your work, then work your plan.
我的首頁:http://blog.elleryq.idv.tw
351899by http://counter.li.org