2014-06-18 8 views
-4

J'ai quelque chose comme ça. Le problème est que les chaînes ne doivent être que des lettres, comment puis-je faire cela? Cela fait quelques heures que je suis assis dessus et je ne trouve aucune solution de travail. J'ai essayé d'utiliser les réponses de ce sujet Accept only letters mais je suppose que je suis trop stupide et ne peut toujours pas faire fonctionner :(Chaîne C++ seulement lettres

#include <string> 
#include <vector> 
#include <iostream> 
#include <iterator> 
#include <algorithm> 


using namespace std; 

int main(void) 
{ 
vector <string> strings; 
string line; 

do 

{ 
cout << "enter string, 'stop' stops: "; 
cin >> line; 
strings.push_back(line); 
} 

while (line != "stop"); 

vector <string> :: iterator w; 
cout << "Before sorting \n"; 
for (w=strings.begin(); w!=strings.end(); w++) 
cout << *w << endl; 

sort (strings.begin(),strings.end()); 
cout << "After sorting \n"; 
for (w=strings.begin(); w!=strings.end(); w++) 

cout << *w << endl; 

} 
+0

Dans la boucle while vous devez itérer la chaîne et si une lettre dans ce n'est pas une lettre que vous devriez pas le repousser dans le vecteur des cordes. Pour vérifier si une lettre est alphabétique, vous pouvez utiliser 'std :: isalpha' http://www.cplusplus.com/reference/cctype/isalpha/ – 101010

+0

Votre boucle serait mieux comme' while ((std :: cin >> line) && (line! = "stop")) {strings.push_back (ligne);} '. De cette façon, vous n'obtenez pas l'élément supplémentaire et vous savez que la lecture a réussi avant d'utiliser la valeur. Il est également très facile d'ajouter une autre vérification pour que la chaîne ne soit que des lettres, ou de combiner la condition dans une fonction 'readString'. – ghostofstandardspast

+0

@ 40two, Plutôt que de boucler vous-même, j'utiliserais 'std :: all_of'. – ghostofstandardspast

Répondre

1

Vous devez ajouter le code de validation. Pour les cas simples, vous pouvez faire quelque chose comme:

if (std::find_if(line.begin(), 
        line.end(), 
        [](unsigned char ch) { return !isalpha(ch); } 
     ) != line.end()) { 
    // not all letters 
} 

(Ceci est vraiment seulement approprié pour des projets scolaires, et ne travail pour le codage de réseau habituel, UTF-8.)

+0

Y a-t-il une raison de préférer 'std :: find_if' à' std :: all_of' (ou peut-être 'std :: any_of' si vous testez la négation) en plus de' std :: find_if' étant disponible avant C++ 11? Je trouve ces deux choses un peu plus claires quant à ce qui est testé ici. – ghostofstandardspast

+0

@ghostofstandardspast Seulement que 'std :: find_if' ne nécessite pas C++ 11. Si vous êtes sûr de C++ 11, 'std :: any_of' est probablement un choix encore meilleur. –

Questions connexes