?
Die einfachste Lösung wär wohl:
#include <cstdio>
#include <string>
// ...
std::string zeile;
int min, max;
std::getline(std::cin, zeile);
if(2 == std::sscanf(zeile.c_str(), "%d-%d", &min, &max)) {
// erfolgreich eingelesen
} else {
// nicht erfolgreich geparst
}
Ich würds wahrscheinlich mit boost.spirit machen, auch wenns hier wahrscheinlich overkill ist. Das säh dann etwa so aus:
#include <boost/spirit/core.hpp>
#include <boost/spirit/utility/functor_parser.hpp>
#include <iostream>
#include <sstream>
#include <string>
struct range {
int min, max;
};
struct range_parser
{
typedef range result_t;
template <typename ScannerT>
int operator()(const ScannerT &scan, result_t& result) const
{
namespace bs = ::boost::spirit;
if (scan.at_end())
return -1;
bs::parse_info<typename ScannerT::iterator_t> info =
bs::parse(scan.first, scan.last,
bs::int_p[bs::assign_a(result.min)] >> '-' >> bs::int_p[bs::assign_a(result.max)],
boost::spirit::space_p);
if(info.hit) {
scan.first = info.stop;
return info.length;
}
return -1;
}
};
boost::spirit::functor_parser<range_parser> range_p;
int main() {
range r;
std::string s;
std::getline(std::cin, s);
boost::spirit::parse_info<std::string::iterator> info
= boost::spirit::parse(s.begin(), s.end(), range_p[boost::spirit::assign_a(r)]);
if(info.full) {
std::cout << r.min << ' ' << r.max << std::endl;
} else {
std::cerr << "Konnte \"" << s << "\" nicht parsen." << std::endl;
}
}
Das Ding ist nachher in der Anwendung flexibler, aber halt auch komplexer. Und du brauchst boost, wobei das eigentlich sowieso ne gute Idee ist.