Читать пару символов, разделенных T C ++
Вопрос
Друзья, я хочу прочитать пару персонажей, разделенных 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;
}