2012-12-10 50 views
2

我有一些問題與cin。當我輸入一個字符而不是一個整數時,cin不起作用,之後我甚至不能輸入新的值。我該怎麼辦?我已經試過fflush(stdin)cin在我的程序中無法正常工作。我該如何解決它?

struct PersonList 
{ 
    Person person; 
    PersonList* personListPtr; 
}; 


void addPerson(PersonList*& ptr, int position); 
void deletePersonList(PersonList* ptr); 




int main() 
{ 
    PersonList* personListPtr = NULL; 

    int flag = 0; 
    int pos = 0; 
    int i; 

    while(flag != 27) 
    { 
     system("cls"); 
     cout << "1 - add objects\n" 
      << "2 - delete objects\n" 
      << "ESC - exit\n"; 
     switch(flag) 
     { 
     case '1': 
      cout << "Enter position: "; 
      **cin >> pos;** 
      addPerson(personListPtr, pos); 
      break; 
     case '2': 
      break; 
     case '3': 
      break; 
     } 
     flag = _getch(); 
    } 


    deletePersonList(personListPtr); 

    return 0; 
} 

謝謝。

+4

看起來你應該在'switch'語句之前進行輸入,但不是。如果您不提示用戶使用它,您的應用程序如何知道要執行哪個菜單選項? –

+0

除非偶然'flag'包含三個字符之一,否則他會掉過開關。 (它對我來說並不是很明顯,他想要做什麼,但我懷疑他需要像ncurses這樣的東西,還有更多的代碼來實現它。) –

+0

起初flag == 0 – Vorgin

回答

0

你似乎混合了幾個成語。我不知道 _getch()是做什麼的,但我無法想象它在 與std::cin兼容;例如,std::cin將具有(或可能具有) 預讀,讀取你的標誌字符。你不能簡單地混合來自同一個源的不同流。

至於你所說,一旦進入 東西不能轉換成你正在閱讀什麼特殊的問題, 流進入錯誤狀態(你應該使用值前檢查 ),和在清除錯誤(std::istream::clear())之前,其上的所有操作都將變爲空操作 。但這是 不會解決其他問題。如果你堅持使用 這樣的東西如_getch(),那麼你必須使用它的所有 您的輸入,建立一個字符串輸入的位置,和 使用std::istringstream來轉換它。根據 函數的實際功能,您可能還需要處理諸如退格鍵,輸入以及甚至可能回顯的內容 。

相關問題