查看完整版本: 以getchar()輸入字串後如何讀出字串字數[已解決]
頁: [1]

歹年冬厚肖狼 發表於 2007-9-27 12:03 AM

以getchar()輸入字串後如何讀出字串字數[已解決]

[]今天在課堂上
老師出了個作業:以getchar()與putchar()輸入與輸出字元或字串;並且計算字元或字串的字數;(本來還要將輸入之小寫英文字母轉換為大寫英文字幕,不過後來作罷)
前面的輸入與輸出字元或字串非常easy
不過在計算字數的地方卡關了
我自己的想法
getchar()是在輸入時隨機在記憶體安排字元的存放位置
不像字串"陣列"屬於連續的記憶體位置
可以透過改變[]內的值來讀取哪些位置有存放資料進行計數
但隨機安排的getchar()卻不行
我也試過String.h函式庫用來計算字串字數的strlen()函式   
結果也失敗
總之今天的作業是未完成了
------------------------------------------------------------------
請問
Q:如果只載入標準I/O stdio.h函式庫
    要以什麼方法來讀取字串字數?

Q2:為什麼strlen會失敗?

[ 本帖最後由 歹年冬厚肖狼 於 2007-10-1 07:23 PM 編輯 ]...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

yesyo 發表於 2007-9-27 01:06 AM

不知道有沒有搞錯你的意思,是要輸入字串然後計算字元數目?

#include <stdio.h>

main()
{
        int num = 0;
        int c;

        while ((c = getchar())!= EOF)
                num++;

        printf("\nThe number of characters is %d.\n", num);
}

迴圈內或許還要再做一些處理,濾掉空白鍵之類的,看你的需求。

抱歉我第一次寫 C,語法或用法不好還請多指教。
希望能夠給你一點思考的方向。

goodbye_mylove 發表於 2007-9-29 11:38 PM

回復 #1 歹年冬厚肖狼 的帖子

strlen 的確是計算字串長度的函數

想告訴你幾個觀念

(1) 如樓上所示,他所用的是 EOF( End Of File),那的確是在 getchar 中的結束符號

     請你執行以下程式

    char a[] = "good";
    for(int i=0; i<5; i++)
    {
     printf("%d\n",a);
    }

    輸出應該是
    103
    111
    111
    100
    0

   注意,第五個元素是  0 (也就是 '\0'),

   所以 strlen 的函式你也可以寫一個,因為它是判斷最後一個位元是 0 的就傳回(有興趣的話再回PO給我)

(2) 請你執行以下程式

     printf("%d\n",EOF)

    你會發現,輸出是 -1

    知道其中差別了嗎?

(3) 整理:
     
     strlen() 結尾是 0
     但 getchar() 結尾是 -1

(4) 樓上的程式沒錯,但有個小地方注意....

[ 本帖最後由 goodbye_mylove 於 2007-9-30 12:50 AM 編輯 ]...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

goodbye_mylove 發表於 2007-9-30 01:17 AM

#include <stdio.h>

void main()
{
    int num = 0;
    int c;

     while ((c = getchar())!= EOF)
         putchar(c),num++;

     printf("\nThe number of characters is %d.\n", num);
}


我想這就是你要的程式,
但必須提醒你,


(1) 錯誤執行方式

執行結果方式若是
(輸入) 1234 (enter)
(輸出) 1234
|
(游標換一行,因為你之前有輸入一次 enter)

並不會出現字數...
除非這個時候你馬上按下 ctrl + Z ,再按(enter)
輸出也只會是 4+1=5
因為你除了字數之外,還多按了一個 (enter)
所以如果你按了 8個 enter
輸出會是 4+8=12

(2) 正確執行方式

(輸入) 1234 (ctrl +Z) (enter)
(輸出) 1234 (ctrl + Z)(enter)
(輸出)4


(3) 解說

EOF,在 getchar() 中,是"讀取值失敗" 的時候才會有的傳回值...
所以程式最後用 ctrl + Z 塞一個 EOF 給他
(因為 enter 不等於 EOF,getchar() 會讀到 enter,而不是讀到 EOF)
在執行過程中, enter 也都還算是一個字元!



我想我表達的不是很好
但基本上觀念都有了
如果你有念書的話,
是看得懂得...

[ 本帖最後由 goodbye_mylove 於 2007-9-30 01:23 AM 編輯 ]...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

歹年冬厚肖狼 發表於 2007-10-1 07:22 PM

回復 #4 goodbye_mylove 的帖子

感謝goodbye_mylove的指點
正如你所說
一開始我不知道EOF=ctrl + z
寫出來的程式輸入完字串後就停格
我知道要按ctrl + z後又出現新問題
字數會+3
(好像是因為enter   ctrl     z所以+3)
一開始我是在程式結尾以-3的方式來結束
後來被指點以'\n'來作為條件
因為enter相當於是\n
如此一來便不會將enter列入成立num++之中
再次感謝goodbye_mylove的指點
謝謝你<br><br><br><br><br><div></div>

goodbye_mylove 發表於 2007-10-2 12:38 AM

回復 #5 歹年冬厚肖狼 的帖子

哪裡哪裡

大家都是初學者

互相學習求精進而已...:biggrin:
頁: [1]