2017-10-09 3 views
0

Vous essayez d'écrire une fonction qui analyse un fichier d'entrée et affiche des informations telles que des caractères distincts, la longueur moyenne de chaque mot et le nombre total de mots. J'ai du mal à comprendre comment garder la trace des caractères distincts dans une chaîne. A titre d'exemple, la ligne:Comment garder une trace de caractères et de mots distincts?

Etre ou ne pas être, telle est la question.

Doit contenir 10 mots au total, 12 caractères distincts et 3,2 mots de longueur moyenne.

Ceci est le code que j'ai jusqu'à présent:

void fileInfo(const string& fileName) 
{ 
    ifstream in(fileName); 
    if (in.fail()) 
    { 
      cout << "Error, bad input file."; 
    } 

    string line = ""; 
    int wordTotal = 0; 
    while (getline(in, line)) 
    { 
      istringstream ss(line); 
      string word = ""; 
      while (ss >> word) 
      { 
       wordTotal++; 
       for (size_t i = 0, len = word.size(); i < len; i++) 
       { 
        if (word.at(i)) 
       } 
      } 
    { 






} 
+0

Puisqu'un 'std :: set' ne stocke pas de doublons, vous pouvez utiliser un' std :: set 'et insérer chaque caractère du mot dans l'ensemble. – PaulMcKenzie

Répondre

0

Une solution consiste à utiliser un std::unordered_set<char> pour stocker les lettres de chaque mot. Comme un unordered_set ne stocke pas de doublons, vous obtenez un ensemble de lettres distinctes. Deuxièmement, vous ne voulez compter que les caractères alphabétiques, pas les signes de ponctuation ou les chiffres avant d'insérer un ensemble. Ainsi, vous devez filtrer chaque caractère pour vous assurer qu'il est alphabétique.

void fileInfo(const string& fileName) 
{ 
    std::unordered_set<char> cSet; 
    //... 
    while (ss >> word) 
    { 
     wordTotal++; 
     for (auto v : word) 
     { 
      if (std::isalpha(v)) 
       cSet.insert(std::tolower(v)); 
     } 
    }  
    //... 
} 

Live Example

Le mot est uniquement inséré dans le jeu si elle est alphabétique. Notez également que la lettre insérée est la version minuscule.