Zeichenbereich die eingegeben werden kann



  • Wie geht es, wenn ich einen Zeichenbereich eingeben will z.B.die Eingaben von User dürfen nur zwischen 0 bis 9 sein anderes wird eine Fehlermeldung ausgegeben.
    Danke



  • if (eingabe -'0'>=0 && eingabe -'0'<=9){
    
               //gut
    
            }else 
               //schlecht
    


  • Ja hast schon recht aber ich glaube ich habe falsch geschrieben.Ich will einen Zahlenbereich eingeben 0-9.
    Danke
    🙂



  • 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.


Log in to reply