2010-10-09 121 views
2

爲什麼cin.getline開始爲身體輸入的第二行工作,但打破了第一行?cin.getline正在跳過一行輸入,並採取下一步

範例程序運行:

Enter name: Will 
Enter body: hello world 
hello again <= It accepts this one 



char* name = new char[100]; 
char* body = new char[500]; 

std::cout << "Enter name: "; 
std::cin.clear(); 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
std::cin.getline(name, 100); 

std::cout << "Enter body: "; 
std::cin.clear(); 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
std::cin.getline(body, 500'); 
std::cin >> body; 
+0

你是什麼意思它不工作? – 2010-10-10 23:18:17

回答

2

因爲你忽略了與cin.ignore聲明的第一行。

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

這將忽略整條線。

刪除,你會得到你想要的。

您可能還想刷新cout流以確保您的輸出立即打印到屏幕上。在你的getline之前添加一個cout.flush();

+0

我刪除了他們,它是一樣的,除了它跳過名稱輸入 – Will03uk 2010-10-09 23:57:25

+0

@ Will03uk:我添加了一些我的答案。你可能想要添加一個刷新。 – JoshD 2010-10-10 00:29:23

+2

幾個星期前,我對flush aq做了同樣的斷言,但是@anon指出std :: cin綁定到std :: cout,在std :: cin做一個read之前強制自動刷新:http:// www .cplusplus.com/reference/iostream/ios/tie/ – 2010-10-10 01:02:40

2

由於JoshD說,但此外,還可以通過使用std::stringstd::getline<string>頭節省了大量的工作&疼痛。

像...

#include <string> 
#include <iostream> 
int main() 
{ 
    using namespace std; 
    std::string name; 
    cout << "Enter name: "; getline(cin, name); 
} 

乾杯&心連心,

- 阿爾夫

+0

非此工作? – Will03uk 2010-10-10 09:37:07