NSString - characterAtIndex

DruideDruide Membre
février 2006 modifié dans API AppKit #1
Comme par hasard je suis un débutant en programmantion.

Je suis en train de me taper le livre d'Aaron Hillegass " Cocoa Programing for Mac OS X" seconde édition.

Je suis rendu au troisième chapitres et j'ai décidé de mettre en pratique ce que j'ai appris. Aussi je me suis lancé dans la confection d'une calculatrice. Il me semble que c'est un petit projet qui est relativement simple qui va me permette de bien intégré les notion du livre.

Jusqu'à  présent tout va bien sauf que la j'ai un problème avec la commande "cararaterAtIndex".

Le problème doit être relativement simple mais j'arrive pas à  trouvé la réponse dans la documentation.

Le problème c'est que cette commande retourne un " unichar "

Par exemple pour la lettre X il me retourne " 88 'X' ".

Comment dois-je mi prendre pour obtenir tous simplement la lettre X.  Je présume qu'il faille convertir le unichar mais comme je le disais plus haut. Je ne trouve rien de vraiment claire dans la documentation

Merci de prendre le temps d'éclairé ma lanterne.

Réponses

  • LeChatNoirLeChatNoir Membre, Modérateur
    07:53 modifié #2
    Je suis pas spur d'avoir bien compris.
    En gros, tu fais comme ca :
    unichar c;
    c=[tonNSString characterAtIndex:tonIndex];

    if (c  == '+' || c == '-'))
    tatati, tatata.

    Non ?
  • 07:53 modifié #3
    Je crois que ce que demande PixelLux est comment convertir un unichar en NSString. Si c'est effectivement ça, je te recommande plutôt la méthode -substringWithRange: avec comme argument un range de longueur 1.
    [tt]NSString* str = [aStr substringWithRange:NSMakeRange(index,1)];[/tt]
  • DruideDruide Membre
    07:53 modifié #4
    Je ne sais pas trop. J'en suis vraiment a mes premiers pas en matière de programmation.

    Je prend en note ton explication et je vais faire des tests vendredi prochain - je vais être en congé.



    Mais bon pour être peut-être plus clair, je vais ré-expliqué mon problème.

    Quand je fais caracterAtIndex: j'obtiens pas simplement une lettre comme un X. J'obtiens plutôt quelque chose comme 88 'X'.

    C'est un résultat qui m'embête. Je veux juste obtenir la lettre X.

  • AliGatorAliGator Membre, Modérateur
    07:53 modifié #5
    Oui c'est ce que j'avais cru comprendre de la confusion que tu fais.

    En fait le unichar que tu obtiens est bien un caractère 'X' tout bête.
    C'est juste que quand tu demandes d'afficher ton unichar il t'affiche plus de détails que tu ne veux. Enfin je pense que c'est ça.
    Quand tu dis "J'obtiens 88 'X'"", tu l'obtiens comment ? en faisant un NSLog de ton unichar ? Peux-tu écrire ici la ligne qui te permet d'obtenir ce résultat ?

    En effet, 88 est le code ascii du caractère 'X'. Si tu demandes d'afficher ton unichar uc sous forme d'un simple caractère ([tt]NSLog(@%c,uc);[/tt]) il devrait ne t'afficher que le caractère en question ("X").
    Si tu demands d'afficher ton unichar sous forme d'un nombre (%d au lieu de %c) il va t'afficher la valeur ascii, à  savoir 88, et non pas 'X'.
    Pourtant c'est la même valeur, la variable uc n'a pas changé de contenu.
    C'est juste la façon de l'afficher qui fait ça.

    Démonstration : [tt]NSLog("En tant que nombre : %d = %d ; En tant que caractère : %c = %c",88,'X',88,'X');[/tt]

    Donc le contenu de ton unichar est bon, c'est la façon dont tu l'affiches qui fait que tu as plusieurs informations (son code ascii et sa représentation en caractère) d'affichées, mais tu peux très bien comparer ce unichar à  un autre sans souci
    if (uc == &#39;X&#39;)<br />&nbsp; NSLog(&quot;C&#39;est un X&quot;);<br />else<br />&nbsp; NSLog(&quot;Ce n&#39;est pas un X mais un %c&quot;,uc);
    
  • DruideDruide Membre
    février 2006 modifié #6
    Je vois ça dans le visualisateur des variables du débogueur. Avec les Brake Point et le pas à  pas.

    Probablement, que je me suis fait duper par les apparences.

    Je vais faire des tests.

    Merci beaucoup pour votre aide.
  • AliGatorAliGator Membre, Modérateur
    07:53 modifié #7
    En fait, un "unichar" c'est comme un "char" (caractère unique), sauf que ça supporte l'Unicode, c'est à  dire les caractères autres que ceux de l'US-ASCII (par exemple les symboles, les caractères chinois, et plein d'autres caractères Unicode).

    Alors que "char" est limité à  un caractère codé sur 8 bits (1 octet), un unichar est souvent codé lui aussi sur 1 octet mais peut être codé sur plusieurs octets (caractères Unicode autres que l'US-ASCII).

    Tu peux lire un peu de documentation sur l'Unicode et ses formes d'encodage (la plus connue étant l'UTF8, celle utilisée en interne dans les NSString est l'UTF16)

    Un peu de doc : un article de cocoadev, de la doc Apple (dans CoreFoundation et CFString mais bon ça reste valide pour NSString)...

    Bref, un unichar et un char sont tous deux là  opur représenter un caractère, mais le "char" ne code qu'un octet unique à  tou sles coups, le unichar est plus là  pour les caractères Unicode, donc ça inclus les caractèers US-ASCII comme le char, mais aussi les auters caractères comme les symboles chinois et autres.

    Au niveau de la comparaison, il n'y a pas trop de soucis non plus, tu compares un unichar avec un autre de la même manière que tu comparerais un char avec un autre, genre [tt]if(uchar == 'X') // ....[/tt].
Connectez-vous ou Inscrivez-vous pour répondre.