2015-10-11 1 views
0

Si une erreur de codage survient lors de l'interprétation de caractères larges, la fonction définit errno sur EILSEQ.Est-il possible qu'il y ait une erreur de codage lors de la lecture d'un caractère?

scanf("%d", &i); 

Si l'entrée est plus 2147483648 (si i est signed int), scanf va changer la valeur de errno.

Mais si je tente de lire un caractère, comme ceci:

scanf("%c", &c); 

Est-il possible d'entrer un caractère qui provoque une erreur de codage? Je l'ai testé avec l'entrée UTF-8, mais cela a bien fonctionné (pour , c le code décimal est -32, mais errno est 0).

+0

'% c' doesn Ne fais pas de caractères larges. '% lc' serait le spécificateur de conversion pertinent. – EOF

+0

Votre programme fonctionne entièrement comme prévu. La première valeur de caractère de votre personnage Tamil Unicode '8', U + 0BEE, est en effet de 224 en notation UTF8. Lorsqu'il est interprété comme une valeur de caractère * signed *, c'est le '-32' que vous obtenez. – usr2564301

Répondre

1

D'abord, vous devez utiliser un indicateur de conversion différent pour les caractères larges:

wchar_t c; 
scanf("%lc", &c); 

La réponse à votre question est « oui », vous devez toujours vérifier que l'entrée est valide!

un caractère non valide (un clavier ne produit que des caractères valides), mais les entrées peuvent provenir d'autres sources et, dans la plupart des cas, vous ne pouvez pas les prédire à l'avance. Il est également possible que le jeu de caractères d'entrée ne corresponde pas à ce que votre programme pense être (dans ce cas, vous avez des problèmes plus importants, mais une vérification des encodages invalides aidera à détecter le problème plus tôt).

Dans tous les cas, il est bon de vérifier la valeur de retour de scanf de la même façon de vérifier la valeur de retour de malloc (vous faites faire ça, non?)

if (scanf("%lc", &c) != 1) 
    emit_input_error_and_abort(); 
+0

Je vérifie toujours la valeur retournée par 'scanf', et comme je sais que dans mon programme l'entrée est uniquement ASCII, cela suffit pour l'instant. Cependant, connaissez-vous un exemple lorsque 'check_encoding(); scanf ("un caractère", &c); 'changerait la valeur de' errno'? – klenium

+0

Je ne sais pas ce que "check_encoding" fait? 'scanf' ne manquera jamais de lire un caractère non-large'% c' à moins que vous ne frappiez EOF, ENOMEM, ou l'un des autres codes de retour qui ne sont pas réellement entrés – ams

+0

Si 'c' est' char', cette fonction vérifie le codage de l'entrée.S'il s'agit de UTF-8, le funcion'd affiche un message d'erreur. Ou quelque chose comme ça.: DI veut seulement savoir quand 'errno' est changé # 1: la variable est un type-number, et l'entrée est hors de portée # 2: Je pensais que si j'entrais en UTF -8 caractères qui causent également OoR, et comme dans les nombres, 'scanf' change' errno', mais non.Un autre exemple quand je dois vérifier 'errno'? – klenium