1

友達、\tで区切られた1組の文字を読みたいです。ユーザーがいずれかの文字にzを入力するまで、入力を読み続けたいと思います。

これが私が考えたオプションです:

while (cin>>ch1>>ch2)
{

// process ch1 & ch2

}

std::string str;

while (getline(cin, str) ){

//split string

}

また、入力を検証して、入力が正しいことを確認したいと思います。最善の方法を提案してください。これが重複している場合は、正しいものを指定してください。

ありがとう。

4

3 に答える 3

3

その名前にもかかわらず、あなたはstd::getline()行以外のものを読むために使うことができます。区切り文字を示すオプションの3番目のパラメーターを取ります。デフォルトはですが、代わりに'\n'使用できない理由はありません'\t'

std::string line;
while( std::getline(is,line) ) { // read lines
  std::istringstream iss(line); 
  std::string field;
  while( std::getline(iss,field,'\t') { // read fields from line
    // process field
  }
}
于 2010-04-24T21:52:30.357 に答える
2

あなたの最初のアプローチは良くてとてもC++っぽいです。唯一の問題は、によって区切られた文字だけ\tでなく、たとえば、プレーンスペース()によっても文字を読み取ることです。

コードは次のようになります。

#include <iostream>

void main () {
   char c1, c2;
   while (std::cin >> c1 >> c2) {
      if (c1 == 'z' || c2 == 'z') break;
      // Otherwise do something useful
   }
}

別のアプローチはgetche()、入力から1つの記号を取得し、それを画面に表示するために使用することです。コードは次のとおりです。

#include <iostream>
#include <conio.h>

void main () {
   while (true) {
      char c1 = getche();
      char delimiter = getche();
      char c2 = getche();

      // Output end of line
      std::cout << std::endl;

      if (delimiter != '\t' || c1 == 'z' || c2 == 'z') break;
      // Otherwise do something useful
   }
}

enter現在、シーケンスを入力した後にキーを押す必要はないことに注意してください。必要に応じて、もう1つのgetche()呼び出しを追加し、charが32に等しいかどうかを確認できます(コードを入力してください)。

于 2010-04-24T21:49:50.030 に答える
1
int main(int argc, char* argv[])
{
    char c;
    int count = 0;
    string s; // s.reserve(LOTS);
    while(cin) while( cin.get(c) ) { // consume newlines as well
        if( c == '\t' ) continue;
        if( c == 'z' ) break;
        ++count;
        s += c;
    }
    cout << "got " << count << " tokens." << endl;
    cout << s << endl;
    return 0;
}
于 2010-04-24T21:55:50.217 に答える