[英]Why is cin.getline() skipping the first word in each line?
我正在嘗試逐行顯示命令行輸入的文本文件的文本。 但出於某種原因,它會跳過第一行之后每行的第一個單詞。
代碼:
using std::cout;
using std::cin;
using std::endl;
int main (int args, char* argv[])
{
char x[100];
char y[100];
char z[100];
cin.getline(x,100) >> argv[2];
cin.getline(y,100) >> argv[2];
cin.getline(z,100) >> argv[2];
cout << x <<endl;
cout << y <<endl;
cout << z <<endl;
return 1;
}
運行 ./a.out < moby.txt 顯示:
CHAPTER 1. Loomings.
me Ishmael. Some years ago--never mind how long precisely--having
or no money in my purse, and nothing particular to interest me on
但是 moby.txt 中的前三行是這樣的:
CHAPTER 1. Loomings.
Call me Ishmael. Some years ago--never mind how long precisely--having
little or no money in my purse, and nothing particular to interest me on
代碼省略了“Call”和“little”。
我覺得這是一個 \\n 錯誤,但我不知道如何修復它。 在此先感謝您的幫助。
cin.getline(x,100) >> argv[2];
您將一行(或該行的前 99 個字符)讀入x
。 然后跳過任何空格並將下一個單詞讀入argv[2]
。 第一個詞在那里結束。
你為什么使用>> argv[2]
? 你可能想用這個做什么? argv[2]
可能不存在,即使存在,您也無法控制argv[2]
指向的字符數組的大小,因此超出該數組的可能性非常高。
與其直接為此使用char
數組,不如使用std::getline
和std::string
將行讀入std::string
對象:以這種方式編寫正確的代碼要容易得多。 例如,
std::string x;
if (!std::getline(std::cin, x)) {
// handle input error
}
@James McNellis 已經指出了基本問題。 我的建議是:
getline
的成員函數形式。getline
和>>
。我發現另一個 C++ getline 使用起來更容易、更安全;
string str;
getline (cin,str);
將整行並將其放入一個字符串中,然后您可以通過許多精細的字符串方法進行播放,或者如果您想對字符串的某些部分進行 I/O,則可以使用 stringstream。
這是我選擇做的,以確保我在使用getline
時不會遺漏任何單詞或字母:
cout << "\nEnter some words: ";
while (getline(cin,myString)){
getline(cin,myString);
break;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.