Читать пару символов, разделенных T C ++

StackOverflow https://stackoverflow.com/questions/2706245

  •  01-10-2019
  •  | 
  •  

Вопрос

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

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

while (cin>>ch1>>ch2)
{

// process ch1 & ch2

}

std::string str;

while (getline(cin, str) ){

//split string

}

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

Спасибо.

Это было полезно?

Решение

Несмотря на свое имя, вы можете использовать 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
  }
}

Другие советы

Ваш первый подход хороший и очень C ++ ISH. Единственная проблема в том, что она будет читать символы, не только разделенные \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() Позвоните и проверьте, является ли CHAR равен 32 (введите код).

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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top