Accepter uniquement des lettres
Cela devrait accepter que des lettres, mais il n'est pas encore correct:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
std::string line;
double d;
while (std::getline(std::cin, line))
{
std::stringstream ss(line);
if (ss >> d == false && line != "") //false because can convert to double
{
std::cout << "its characters!" << std::endl;
break;
}
std::cout << "Error!" << std::endl;
}
return 0;
}
Voici le résultat:
567
Error!
Error!
678fgh
Error!
567fgh678
Error!
fhg687
its characters!
Press any key to continue . . .
fhg687
devrait erreur de sortie parce que des chiffres dans la chaîne.
Accepté de sortie doit contenir seulement des lettres, comme ghggjh
.
Voulez-vous dire seulement les caractères alphabétiques, ou doit-il également accepter les choses comme des signes de ponctuation?
Oui seulement alphabétique. Non! @, ? etc. etc.
Dans ce cas, c'est presque, identique à un couple de précédent questions. Le principal changement serait la substitution de
Oui, vous avez raison. Précédente question, demandez des chiffres.
Oui seulement alphabétique. Non! @, ? etc. etc.
Dans ce cas, c'est presque, identique à un couple de précédent questions. Le principal changement serait la substitution de
isalpha
pour isdigit
.Oui, vous avez raison. Précédente question, demandez des chiffres.
OriginalL'auteur sg552 | 2012-12-08
Vous devez vous connecter pour publier un commentaire.
Mise à jour: de montrer une meilleure solution.
L'approche la plus simple serait probablement pour itérer sur chaque char dans l'entrée et vérifier si ce char est dans Anglais-lettre varie en ascii (haut + bas):
std::isalpha()
oh chouette! J'ai vu vu que lors de la lecture de Benjamin en réponse appris quelque chose de nouveau aujourd'hui =)
Pourriez vous s'il vous plaît vérifier mon code ici ideone.com/2CVw36. Même après que j'ai fait le changement de la
fhg687
est encore uncharacter
. Je vous remercie.Le problème, c'est que vous n'étiez pas une itération à travers les personnages de votre chaîne (sens: à la recherche à chaque caractère un à la fois). Voir ma réponse mis à jour pour une meilleure solution pour voir ce que vous avez besoin de changer.
line
déjà est une chaîne de caractères, alors pourquoi ne pas utiliser directement et éliminer lesstringstream
en tout?OriginalL'auteur sampson-chen
Vous seriez beaucoup mieux à l'aide de
std::all_of
sur la chaîne, avec un prédicat. Dans votre cas, le prédicat seraitstd::isalpha
. (en-têtes<algorithm>
et<cctype>
requis)J'ai eu à utiliser ::isalpha
OriginalL'auteur Benjamin Lindley
Vous pouvez également utiliser des expressions régulières, ce qui peut être pratique si vous avez besoin de plus de flexibilité.
Pour cette question, Benjamin réponse est parfaite, mais seulement comme une référence, c'est comment regex peut être utilisé (notez que
regex
est aussi de la partie C++11):Si
string
ne contient que des caractères alphabétiques et au moins l'un d'entre eux (le+
), puismatch
esttrue
.Exigences:
<boost/regex.hpp>
et-lboost_regex
.<regex>
.OriginalL'auteur Vincenzo Pii