2010-01-06 76 views
-1

我有一個小菜單和子菜單的簡單程序。用戶從1-9中選擇並點擊進入。我希望代碼只讀取數字1-9,從標準輸入中刪除「\ n」。我試過這樣:cin.get()並省略換行char

#include <cstdio> 
#include <iostream> 

using std::cin; 
using std::cout; 
using std::endl; 

class cProgram 
{ 
    private: 
    char W; 

    public: 
    char choice(void); 
    void choice(int _W); 

    void showSubeMenu1(void); 
    void showSubeMenu2(void); 
    void showMainMenu(void); 
}; 

char cProgram::choice() 
{ return W; }; 

void cProgram::choice(int _W) 
{ W = _W; }; 

void cProgram::showMainMenu(void) 
{ 
    cout << "MAIN MENU:" << endl 
     << "[1] option 1" << endl 
     << "[2] option 2" << endl 
     << "<0> quit" << endl 
     << "Your choice: "; 
    choice(cin.get()); 
    getchar(); 
} 

switch (choice()) 
{ 
    case '1': choice('n'); showSubeMenu1(); break;  
    case '2': choice('n'); showSubeMenu2(); break; 
    case '0': break; // EXITS the program 
    default: choice('n'); showMainMenu(); break; 
} 

// choice('n'); sets W to neutral char (not 1,2 or 0) 

一切工作正常,直到用戶點擊「\ n」,而不是普通的鍵。 「正常」我的意思是不是「\ n」。所以,當用戶輸入時,必須再次輸入(連續兩次)。其他方式表現奇怪。

+1

您的代碼不能編譯,它沒有一個main()函數,你根本沒弄清楚到底是什麼「怪異」的行爲,你的程序的展品(這可能會讓你知道什麼是錯的線索)。這足以成爲我身邊的「禁止」 – DevSolar 2010-01-06 10:51:05

+0

在那裏,添加了includes和「using」聲明,將'printf()'改爲'cout',並在類聲明中修正了一個錯字。你仍然沒有'main()',所以我們不能像你那樣運行你的程序,但我會仔細看看'getchar();'並問自己在那裏做什麼...... – DevSolar 2010-01-06 11:02:05

+0

你是對的。我肯定會在另一篇文章中使用你的小竅門。謝謝。 – qlf00n 2010-01-06 11:11:58

回答

1

我不確定你的問題,但我有一些提示給你。當你使用C++時,你應該使用std::coutstd::cin來輸入和輸出。它們來自圖書館<iostream>。你也可以寫using namespace std;,然後你不需要寫std::。函數printf()來自C並且類型不安全,因此您不應該在C++中使用它。

其他流提供許多功能獲取成功或不成功的閱讀/寫作等信息我真的推薦給你。

方法cin.get()只能讀取1個字符,也可以是白色字符('\ n','\ t','')。當你想讀的東西,然後用戶必須寫請求的數據和「

int x; 
cin >> x; 
if (cin.fail()) cout << "Reading error. It is not a number." << endl; 
// cin.eof() means end of file, in this case it is end of input stream 

我知道\:如果您想閱讀數量,而忽略空格(在默認情況下它們的使用類似分隔符),那麼你可以使用此代碼N」。字符'\ n'很重要。我從來沒有嘗試過,但我認爲它可以重新定義。我在某處讀過它。

我希望我的提示是有幫助的

+1

雖然你對'std :: cout'比'printf()'更好的C++風格的評論當然是正確的,'printf()'是**而不是** *棄用*。其次,「使用名稱空間標準;」對初學者來說並不是一個好建議;告訴他使用'使用std :: cout;使用std :: cin;'他不會養成污染他的名字空間的習慣和廚房水槽。 – DevSolar 2010-01-06 10:55:51

+0

好的,你的命名空間是正確的,但它有點主觀。函數printf不是類型安全的,它需要定義字節和地址的計數並打印它。所以它可能不會被正式棄用,但我認爲當你說這是不是大惡。但好的,我會修復它是正確的。 – Gaim 2010-01-06 11:09:30

+0

嘿,我知道我應該使用std :: cout;而不是使用命名空間std;並瞭解污染頭部名稱空間的壞習慣。我試圖簡化我想要的代碼,但現在我發現我做錯了。 感謝您使用istream類的提示。 – qlf00n 2010-01-06 11:16:44