2

C ++文字列ストリームクラスを使用して比較的単純な文字列操作を実行しようとしていますが、get()メソッドに問題があります。何らかの理由で、出力文字を1文字ずつ抽出すると、最後の文字の2番目のコピーが追加されます。

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
   stringstream ss("hello");
   char c;

   while(!ss.eof()) {
      ss.get(c);
      cout << "char: " << c << endl;
   }
   return 0;
}

プログラムからの出力は次のとおりです。

char: h
char: e
char: l
char: l
char: o
char: o

あなたがこれについて私に与えることができるどんな助けでもありがたいです。

4

3 に答える 3

8

ストリームの終わりでは、ストリームss.eof()の終わりにすぐに到達することをまだ知りませんが、次の文字の抽出は失敗します。ストリームの終わりに達したために抽出が失敗したため、c変更されません。プログラムはそれがss.get(c)失敗したことを認識せず、その古い値をc再度出力します。

ストリームから読み取ることができる文字がまだあるかどうかを確認するためのより良い方法は、次のようなループです。

while (ss.get(c)) {
   cout << "char: " << c << endl;
}
于 2009-10-09T00:39:37.860 に答える
2

ループの順序のためです。\0とEOFを読んでいます。

このようにコードを並べ替えます

int main() {
   stringstream ss("hello");
   char c;

   ss.get(c);
   while(!ss.eof()) {
      cout << "char: " << c << endl;
      ss.get(c);
   }
   return 0;
}
于 2009-10-09T00:38:37.160 に答える
1

EOFフラグは、ファイルの終わりを過去に読み取ろうとした場合にのみ設定されます。次のコードは、get()の前ではなく後にEOFをテストすることで、問題を修正します。

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
   stringstream ss("hello");
   char c;

   while(1) {
      ss.get(c);
      if(ss.eof())
          break;

      cout << "char: " << c << endl;
   }
   return 0;
}
于 2009-10-09T00:41:49.727 に答える