Как мне разобрать ввод пользователя из стандартного потока ввода? - PullRequest
1 голос
/ 31 января 2012

Я пишу очень простую программу, в которой я хочу получить пользовательский ввод из стандартного потока ввода (клавиатура), а затем сделать что-то в зависимости от того, с каким вводом я столкнулся. Однако проблема в том, что иногда ввод будет числом (двойным), тогда как в других случаях это будет строка. Я не уверен, какие именно вызовы методов мне нужны, чтобы правильно его проанализировать (возможно, что-то похожее на Integer.parseInt в java).

Вот некоторый псевдокод того, что я хотел бы сделать:

cin >> input
if(input is equal to "p") call methodA;
else if(input is a number) call methodB;
else call methodC;

Ответы [ 3 ]

3 голосов
/ 31 января 2012

Я думаю, это то, что вам нужно:

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

void a(string& s){ cout << "A " << s << endl; }
void b(double d){ cout << "B " << d << endl; }
void c(string& s){ cout << "C " << s << endl; }

int main()
{
    std::string input;
    cin >> input;
    if (input == "p")
        a(input);
    else
    {
        istringstream is;
        is.str(input);
        double d = 0;
        is >> d;
        if (d != 0)
            b(d);
        else
            c(input);
    }
    return 0;
}

Надеюсь, это поможет;)

0 голосов
/ 31 января 2012

Обычное решение, которое я использую, состоит в том, чтобы прочитать входные данные в виде строки (используя std::getline вместо >>) и проанализировать его, как я бы это делал на любом языке - boost::regex здесь очень полезно;если вы уверены, что можете рассчитывать на C ++ 11, то это std::regex (что, я думаю, почти идентично Boost).Таким образом, вы получите что-то вроде:

std::string line;
if ( ! std::getline( std::cin, line ) ) {
    //   Error reading line (maybe EOF).
} else {
    if ( regex_match( line, firstFormat) ) {
        processFirstFormat( line );
    } else if ( regex_match( line, secondFormat) ) {
        processSecondFormat( line ) ;
    } ...
}
0 голосов
/ 31 января 2012
std::string input;
std::cin >> input;
if(input =="p") f();
else if(is_number(input)) g();
else h();

Теперь реализуем is_number() функцию:

bool is_number(std::string const & s)
{
  //if all the characters in s, are digits, then return true;
  //else if all the characters, except one, in s are digits, and there is exactly one dot, then return true;
  //else return false
}

Реализуйте эту функцию самостоятельно, как будто это домашнее задание. Вы также можете рассмотреть случай, как число может начинаться со знака + или -.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...