2017-04-09 5 views
5

J'ai essayé de passer différentes entrées avec le code ci-dessous, mais je n'ai pas réussi à imprimer le message: "Oups, vous n'avez pas entré un caractère ASCII, et encore moins celui qui est y ou n!" J'ai saisi plusieurs caractères Unicode qui ne sont pas de type caractère (en principe, les caractères ALT + nombres aléatoires, p.ex. ™, š, ², Ž, ±, ne sont pas affichés.) Cinquièmement, les entrées qui ne sont pas ignorées ou ignorées caractères ASCIIEst-ce que std :: cin peut échouer à transmettre une entrée utilisateur dans la ligne de commande à une variable avec un type de caractère?

std::cout << "Would you like to play again? Enter y or n: "; 
std::cin >> yOrN; 
isChar = std::cin.fail(); 
//check if the user did not enter an ASCII char, e.g. test with a Unicode character 
if (isChar) 
{ 
    std::cout << "Oops, you did not enter an ASCII char, let alone one that is y or n!\n"; 
    std::cin.clear(); 
} 

OS: Windows 10 64 bits, le processeur x64 compilateur: Communauté Visual studio 2015

Je n'ai pas pu résoudre ce problème par la recherche de « extraire un caractère non-ASCII C++ "et en regardant les trois premières pages

Je suis très nouveau sur Stack Overflow, alors pardonnez-moi si j'ai violé des règles ou un code de conduite avec cette question. J'apprends le C++ sur learncpp.com et j'écris mon propre code pour répondre à la question 2 de ce page. Mise à jour: Je suppose que mon programme n'a aucune raison de valider si un caractère est entré. Cependant, je devine peut-être que j'étais si curieux de savoir que je ne pensais pas trop à savoir si c'était vraiment nécessaire pour le programme.

Répondre

1

std::cin.fail(); retournera vrai si le flux sous-jacent a échoué lire ou écrire des données. cela n'a rien à voir avec l'encodage que vous fournissez.

Il est également à noter que char n'est pas vraiment conscient de utf-8 ou ASCII, c'est juste un octet. les flux C++ ne valident pas non plus le codage des données. Dans ce cas, Ž (et autres) est une entrée valide pour std::cin.

Si vous voulez valider ASCII caractères, vous devez le faire vous-même:

std::cin >> c; 
if (c < 0 || c > 127) { /*handle non ASCII chars*/ } 

Dans votre cas, vous devez valider contre y ou n:

std::cin >> c; 
if (c != 'y' && c != 'n') { /*handle invalid input*/ } 
+0

plaine 'char' ne dépassera jamais 127 sur les systèmes communs –

+0

@MM que se passe-t-il si 'char' est réellement non signé? –

+0

Et si ce n'est pas le cas? OP dit MSVC++ 2015. –