頁:
[1]
以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> 不知道有沒有搞錯你的意思,是要輸入字串然後計算字元數目?
#include <stdio.h>
main()
{
int num = 0;
int c;
while ((c = getchar())!= EOF)
num++;
printf("\nThe number of characters is %d.\n", num);
}
迴圈內或許還要再做一些處理,濾掉空白鍵之類的,看你的需求。
抱歉我第一次寫 C,語法或用法不好還請多指教。
希望能夠給你一點思考的方向。
回復 #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> #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>
回復 #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>
回復 #5 歹年冬厚肖狼 的帖子
哪裡哪裡大家都是初學者
互相學習求精進而已...:biggrin:
頁:
[1]