читать пару символов, разделенных \ t c ++ - PullRequest
1 голос
/ 25 апреля 2010

Друзья, Я хочу прочитать пару символов, разделенных \ t. Я хочу продолжить чтение ввода, пока пользователь не введет z для любого из символов.

Вот варианты, которые я подумал:

while (cin>>ch1>>ch2)
{

// process ch1 & ch2

}

std::string str;

while (getline(cin, str) ){

//split string

}

Кроме того, я хочу проверить ввод, чтобы убедиться, что он правильный. Пожалуйста, предложите лучший способ. Если это дубликат, укажите мне правильный.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 25 апреля 2010

Несмотря на его название, вы можете использовать std::getline() для чтения других вещей, кроме строк. Он принимает необязательный третий параметр, обозначающий разделитель. Значение по умолчанию - '\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
  }
}
2 голосов
/ 25 апреля 2010

Ваш первый подход хорош и очень хорош в 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(), чтобы взять один символ из ввода и показать его на экране. Вот код:

#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 после ввода последовательности. Если хотите, вы можете добавить еще один вызов getche() и проверить, равен ли символ 32 (введите код).

1 голос
/ 25 апреля 2010
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;
}
...