1

コマンドラインで入力したテキストファイルのテキストを1行ずつ表示しようとしています。しかし、何らかの理由で、最初の行の後の各行の最初の単語をスキップします。

コード:

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の最初の3行は次のとおりです。

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エラーのように感じますが、修正方法がわかりません。助けてくれてありがとう。

4

4 に答える 4

7
cin.getline(x,100) >> argv[2];

行(または行の最初の99文字)をに読み込みますx。次に、空白をスキップして、次の単語をに読み込みますargv[2]。最初の言葉はそこで終わります。

なぜ使っているの>> argv[2]?これで何をしようとしているのでしょうか? argv[2]存在しない可能性があり、存在する場合でも、が指す文字配列のサイズを制御できないargv[2]ため、その配列をオーバーランする可能性は非常に高くなります。

charこれに配列を直接使用するのではなく、 std::getlinewithを使用しstd::stringて行をstd::stringオブジェクトに読み込みます。この方法で正しいコードを記述する方がはるかに簡単です。例えば、

std::string x;
if (!std::getline(std::cin, x)) {
    // handle input error
}
于 2011-03-06T05:03:31.267 に答える
1

@James McNellisは、すでに基本的な問題を指摘しています。私のアドバイスは次のとおりです。

  1. のmember-function形式は使用しないでくださいgetline
  2. 同じステートメントで混合getlineしないでください。>>
  3. ループを使用します。
于 2011-03-06T05:07:45.933 に答える
0

他のC++getlineの方が使いやすく安全だと思います。

string str;
getline (cin,str);

行全体を丸呑みして文字列に入れます。これは、多くの細かい文字列メソッドを使用して再生できます。文字列の一部でI/Oを実行する場合は文字列ストリームを使用します。

于 2011-03-06T05:10:50.787 に答える
0

これは、私が使用するときに単語や文字を見逃さないようにするために私が選択したことですgetline

cout << "\nEnter some words: ";

while (getline(cin,myString)){
       getline(cin,myString);
       break;
};
于 2021-04-01T13:29:20.290 に答える