簡體   English   中英

為什么 cin.getline() 跳過每一行中的第一個單詞?

[英]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::getlinestd::string將行讀入std::string對象:以這種方式編寫正確的代碼要容易得多。 例如,

std::string x;
if (!std::getline(std::cin, x)) {
    // handle input error
}

@James McNellis 已經指出了基本問題。 我的建議是:

  1. 不要使用getline的成員函數形式。
  2. 不要在同一個語句中混用getline>>
  3. 使用循環。

我發現另一個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM