Question

Amis, Je veux lire une paire de caractères séparés par \ t. Je veux continuer à lire l'entrée jusqu'à ce que l'utilisateur entre z pour l'un des caractères.

Voici les options que je pensais:

while (cin>>ch1>>ch2)
{

// process ch1 & ch2

}

std::string str;

while (getline(cin, str) ){

//split string

}

, je veux aussi de valider l'entrée pour vous assurer qu'il est correct. S'il vous plaît suggérer la meilleure façon. Si cela est un double, s'il vous plaît me pointer vers la droite.

Merci.

Était-ce utile?

La solution

En dépit de son nom, vous pouvez utiliser std::getline() pour lire d'autres choses que les lignes. Il faut un troisième paramètre optionnel indiquant le delimiter. Celui par défaut est '\n', mais il n'y a aucune raison que vous ne pouvez pas utiliser '\t' à la place.

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
  }
}

Autres conseils

Votre première approche est bonne et très C ++ ish. Le seul problème est qu'il va lire les caractères non seulement séparés par \t, mais aussi, par exemple, par l'espace ordinaire (de );

Le code ressemblerait la manière suivante:

#include <iostream>

void main () {
   char c1, c2;
   while (std::cin >> c1 >> c2) {
      if (c1 == 'z' || c2 == 'z') break;
      // Otherwise do something useful
   }
}

Approche alternative utilise getche() pour prendre un symbole de l'entrée et l'afficher sur l'écran. Voici le code:

#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
   }
}

Notez que pour le moment vous n'avez pas à appuyer sur la touche enter après séquence entrée. Si vous le souhaitez, vous pouvez ajouter un appel getche() et vérifier si l'omble chevalier est égal à 32 (entrez le code).

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top