Forum Programmation.c++ cin >> string

Posté par  .
Étiquettes : aucune
0
3
août
2006
Bonjours tlm
Ma question est la suivante je veux commander un programme avec des instructions aux clavier
ma méthode actuelle est

cin >> keyword >> arg1 >> arg2 >> arg3

Le problème c'est que si une instruction n'a pas besoin d'auto argument il faut quant même que je les entres ( cas trivial EXIT devient EXIT 0 0 0 )
Quelle est la méthode pour pouvoir faire quelque chose du genre

cin >>; xxx ( ou xxx contient tout )

puis de splitter xxx dans un tableau ou vecteur... ( un peu à la perl par exemple )

j'imagine qu'il faut soit envoyer dans une string soit dans un stream ?

Merci d'avance
  • # cin trop limité

    Posté par  . Évalué à 0.

    les stream de la STL sont AMHA bien pouries.

    donc, pour ton truc, soit tu connais la taille maximum de la chaine que peut saisir ton utilisateur, ça devient :

    char chaine[32]; //oui, on code en C++ avec la STL
    cin.getline(chaine, 32);

    stringstream ss(chaine);
    ss >> keyword;
    if (keyword == "kikko") { ss >> a; ss >> b; }

    Si tu ne connais pas la taille maximum, il te reste à faire un truc du genre :

    string chaine;
    while (1) {
    char c = cin.get();
    if (c == '\n') break;
    chaine += c;
    }
    ... //la suite est la même.



    Galère bien avec les streams de la STL !!
    • [^] # Re: cin trop limité

      Posté par  (site web personnel) . Évalué à 2.

        std::istream::getline n'existe pas. C'est une illusion d'optique. Oublie l'existence de ce truc tout pourri.
        Par contre, avec std::getline, c'est différent.
        La solution à la main:
      std::string id, line;
      if ((line >> id) && (std::getline(std::cin, line))) {
          if (id == "EXIT") {
              if ( ! line.empty()) throw ....
          } elseif (id == "toto") {
              std::istringstream iss(line);
              float f1, f2; int i3;
              if ( ! (line >> f1 >> f2 >> i3)) throw ...
              do_toto(f1, f2, i3);
      ......
        Autant dire que la gestion des erreurs complique vite la sauce.
        Il y a aussi des solutions pour utiliser des parsers (lex/yacc si tu es courageux, boost.spirit si ce que tu dois parser est simple, ANTLR, ....)
        Enfin, ton problème me fait penser aux chain-factories. Tu pourrais ainsi créer ta commande à la volée et l'exécuter par la suite.
        PS: Les flux n'ont jamais fait parti de la STL (qui n'est qu'une appellation historique pour un sous-ensemble de la SL du C++). Ils sont dans la SL.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.