[英]C++ weird cin.ignore behaviour
我正在嘗試為我的學生構建一個示例應用程序,它應該演示如何使用 cin.getline 和 cin.ignore 輸入多個 c 字符串,但我得到了奇怪的結果。 在我下面的代碼中,有兩個注釋的 cin.ignore 語句。 如果我取消注釋第一個,那么在運行時需要按 Enter 兩次輸入第一個字符串,只輸入一次輸入第二個。 如果我取消注釋第二個,那么兩個字符串都用一個 Enter 輸入,但第二個字符串不知何故丟失了第一個字母。
#include <iostream>
using namespace std;
struct Unit{
int uid;
char* name=new char[50];
char* shname=new char[10];
};
int main() {
Unit u;
cout << "Record number: ";
cin >> u.uid;
cout << "Unit name: ";
cin.ignore();
cin.getline(u.name,50);
//cin.ignore();
cout << "Unit short name: ";
//cin.ignore();
cin.getline(u.shname,10);
cout << "Record number: " << u.uid << endl
<< "Unit name: " << u.name << endl
<< "Unit short name: " << u.shname << endl;
return 0;
}
我不太明白我做錯了什么
cin.ignore()
只忽略一個字符,不管它是不是空格。
我猜你想忽略直到第一個非白字符。
例如:
while (iswspace(cin.peek()))
cin.ignore();
正如評論中所說, getline
也會讀取行尾。 您需要在使用流運算符 ( >>
) 后忽略它,因為它會在行尾之前停止,第一個getline
將僅讀取新行。
您需要了解為什么有時需要使用ignore()
! 內置格式化輸入操作( operator>>()
)使用任何空格字符作為未提取的分隔符。 另一方面, getline()
掃描第一次出現的換行符(默認為'\\n'
)的輸入,並存儲、存儲和提取所有這些字符。 它以提取換行符結束(您使用的變體也有大小限制;我建議將std::string
與非成員std::getline()
)。
最終效果是在格式化輸入函數之后,緩沖區中的下一個字符是一個分隔空間。 當使用標准輸入與用戶交互時,它很可能是一個換行符,導致后面的getline()
立即完成。 因此,通常會提取這些空格字符,最好使用in >> std::ws
而不是in.ignore()
來處理其他雜散空格字符。 使用getline()
,通常不需要跳過任何字符,因為已經提取了換行符。 換句話說:注釋的ignore()
最好刪除。
另外,請確保在嘗試閱讀后始終驗證輸入是否成功! inout 的絕大多數錯誤是由於沒有檢查(如您發布的代碼中的情況)或在輸入操作之前檢查。 學會事后檢查非常重要,以至於“使代碼簡單”的論點不成立:它不是使代碼簡單,而是完全錯誤!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.