作者loveme00835 (朴髮箍)
看板C_and_CPP
標題Re: [問題] 陷入無線迴圈
時間Thu Mar 31 12:20:50 2011
※ 引述《KKBB0710 (皮皮)》之銘言:
: 有請高手幫我指正以下的程式碼。
: 我想要寫一個程式可以輸入成績等級A B C。最後統計各個等級的總人數。
: cout << "請輸入成績等級: " << endl << "若想停止請輸入EOF" << endl;
: while ( (grade = cin.get()) != EOF ){
: switch ( grade ){
: case 'A':
: case 'a':
: acounter = acounter + 1;
: break;
: case 'B':
: case 'b':
: bcounter = bcounter + 1;
: break;
: case 'C':
: case 'c':
: ccounter = ccounter + 1;
: break;
: case '\n':
: case '\t':
: case ' ':
: break;
: default:
: cout << "Incorrect letter grade entered."
: << "Enter a new grade." << endl;
: break;
: }
: }
: cout << "\n\n每項成績的人數為: "
: << "\nA: " << acounter
: << "\nB: " << bcounter
: << "\nC: " << ccounter;
: return 0;
: }
: 如果使用EOF進行終止,編譯器會說EOF沒有宣告,如果使用-1又會變成無線迴圈。
: 觀念不清,請大家指正了 > <
C++不是這樣寫滴! 先來看看 cin.get() 會回傳什麼:
int_type get();
Returns :c if available, otherwise
traits::eof().
這邊的 int_type、traits 都是 cin 所屬類別裡的 typedefs, 首
先要知道 cin是如何被定義的:
typedef basic_istream<
char> istream;
extern istream cin;
以下是 basic_istream 的模板宣告
template <
class charT,
class traits = char_traits<charT> >
basic_istream;
所以當沒有字元可讀時, cin.get() 會回傳 char_traits<char>::eof()
, 這個值雖然規格書上寫是回傳EOF, 但可能因為char的有號與否
造成比較失敗, 正確的寫法:
while ( (grade = cin.get()) != char_traits<
char>::eof() )
...
一般的作法都是先讀進字元, 再判斷 cin的狀態正不正常:
while ( grade = cin.get(), !cin.eof() )
...
為了方便, 你也可以呼叫另一個版本的 get:
basic_istream<charT, traits>& get(char_type& c );
(這裡的char_type跟int_type是一樣的, 都是char)
它會回傳 cin本身, 當 istream 物件作為迴圈測試條件時, 回傳
true表示讀取工作一切安好(沒有任何錯誤發生, 包含讀到檔案結
尾), 算是比較強的保證:
while ( cin.get( grade ) )
...
--
▂▅▂ ▁ ● ┌─────────────┐
◢ ◣ ◢▂▂◣ ◢▂※◣ ◢▄▂◣ │ 朴 ☆ 素 ★ 妍 │
★ ★ ★ ★ ▉ ★ ★▏▉ ★ ★◣ │ ★ 為何這樣迷人│
◥ˇ◢ ▃◥ˇ◤▃ ◥ˇ◤ ◥ˇ◤◢ │說什麼結束對妳的愛 │
▃▃▇▃▃ ◢▇◣ ▋
▎ ▋¥▎ │ http://ppt.cc/zQtB │
▼ ▼ ▼ ▼ ψ髮箍 └─────────────┘
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115
※ 編輯: loveme00835 來自: 140.121.197.115 (03/31 12:28)
推 azukimiho:好詳細 03/31 17:12
推 ru035pu4xx:有讚可以按嗎? 04/01 08:06