Partage
  • Partager sur Facebook
  • Partager sur Twitter

Conversion Char > Int

Ou vice versa

Sujet résolu
    3 mai 2006 à 15:08:43

    Salut à tous, j'ai un problème lors de la comparaison d'un char avec un int.
    Je m'explique.
    J'ai un fichier texte qui contient diffèrentes valeurs, que je récupère avec fgetc.
    Le problème est qu'il y a des entiers, et des char.
    J'ai une variable int, que j'aimerais pouvoir comparer avec les entiers de mon tableau bi dimensionnel récupéré par fgetc.
    Un code vaut mieux qu'un long discours :

     int chiffre= 9;
        if(grille[5][5] == chiffre)
        {
            printf("lalala");
        }

    grille[5][5] contient le caractère 9, seulement mon "lalala" ne s'affiche pas.
    J'ai essayé diffèrentes choses pour convertir le caractère en int, ou l'inverse, en vain.
    Selon la doc, je peux utiliser ce code :

     int chiffre= 9;
     int test = atoi (grille[5][5]);
        if(chiffre == test)
        {
            printf("lalala");
        }

    Ca compile mais j'ai le droit à une erreur de mémoire après (Envoyer le rapport d'erreur blablabla).

    Pourriez vous me conseiller ? Sachant que je ne peux pas déclarer chiffre comme int, vu qu'il est régulièrement incrémenté.
    J'espère avoir été clair.
    Merci :)

    PS : Si j'écris :

     int chiffre= 9;
     int test = atoi (grille[5][5]);
        if(chiffre == test)
        {
            printf("lalala");
        }

    J'ai le droit à un warning :
    warning: passing arg 1 of `atoi' makes pointer from integer without a cast

    Tandis que si je met :


     int chiffre= 9;
     int test = 0;
     test = atoi (grille[5][5]);
        if(chiffre == test)
        {
            printf("lalala");
        }
    Aucun warning. Pourquoi ?
    • Partager sur Facebook
    • Partager sur Twitter
      3 mai 2006 à 15:19:56

      Si c'est juste un caractère que tu dois convertir tu peux faire :


      char c = '6';
      int num = c - '0'; /* num vaut 6 */


      Pour une chaîne :

      char sa[] = "225";
      int num;

      sscanf(sa, "%d", &num); /* num vaut 225 */


      Sinon pour comparer ta variable chiffre avec le tableau, tu dois parcourir chaque élément jusqu'à que l'un d'entre eux soit égal à chiffre :

      int cmp_matrice(int tab[][5], int num)
      {
          int i, j;
         
          for(i = 0; i < 5; ++i)
          {
              for(j = 0; j < 5; ++j)
              {
                  if(tab[i][j] == num)
                  {
                      return 1;
                  }
              }
          }
          return 0;
      }


      Ensuite pour comparer :
      if(cmp_matrice(grille, chiffre))
          printf("lalala");


      Pour l'erreur de la fonction atoi(), tu dois lui passer une chaîne de caractères et nom une variable (ou tableau comme ici) de int.

      ++
      • Partager sur Facebook
      • Partager sur Twitter
        3 mai 2006 à 15:22:20

        Merci merci, ça marche :D
        Pourrait tu m'expliquer pourquoi fait on ça ?

        char c = '6';
        int num = c - '0'; /* num vaut 6 */

        On retire le caractère '0' au caractère '6' ?
        Etrange ^^
        • Partager sur Facebook
        • Partager sur Twitter
          3 mai 2006 à 15:26:22

          En fait on retranche la valeur du caractère '0' à celle du caractère '6'.
          En ascii, '6' à pour valeur 54 et '0' a 48. Donc ça nous donne 54 - 48 = 6
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            3 mai 2006 à 15:26:24

            Ptite astuce ^^

            On est assuré que les codes des chiffres de '0' à '9' sont rangés à la suite dans cet ordre (par exemple, dans la table ASCII). Cette soustraction permet de calculer la différence entre le caractère '0' et le caractère c, c'est à dire sa valeur (si c vaut '3', c - '0' vaut 3, voir une table d'encodage par exemple). De même, on peut écrire '0' + a avec a entier entre 0 et 9 et on retrouve son caractère.
            • Partager sur Facebook
            • Partager sur Twitter
              3 mai 2006 à 15:28:16

              Merci, ça me sera utile à l'avenir :D
              • Partager sur Facebook
              • Partager sur Twitter
                4 mai 2006 à 10:14:58

                A noter que l'astuce peut être utilisée pour les lettres également (par exemple pour compter le nombre de 'a' et de 'b' entrés) :

                [ non-testé ]

                #include <stdio.h>

                #define L_NUMBER 26
                #define SIZE_T (L_NUMBER + 1)
                /* 1 : space caracters */

                /* c_count : reads caracters, counts it and puts results into `t' */

                void c_count()
                {
                    char t[SIZE_T];
                    char c;

                    while((c = getchar()) != EOF) {
                        toupper(c);
                        if (c >= 'A' && c <= 'Z')
                            ++t[c - 'A'];
                        else
                            ++t[SIZE_T];
                    }
                }


                (No comment sur mon anglais :p )
                • Partager sur Facebook
                • Partager sur Twitter
                  4 mai 2006 à 10:20:14

                  Citation : mleg

                  A noter que l'astuce peut être utilisée pour les lettres également (par exemple pour compter le nombre de 'a' et de 'b' entrés) :


                  Contrairement aux chiffres ('0'-'9'), le comportement que tu décris n'est pas garanti par la norme en ce qui concerne les autres caractères.

                  C'est OK en ASCII, mais pas du tout en EBCDIC.

                  C'est pour ça qu'existent les fonctions de <ctype.h>
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Music only !
                    4 mai 2006 à 10:53:15

                    Il faudrait vérifier que les caractères se suivent donc.

                    Peut-être comme ceci ?

                    [ non-testé ; à améliorer ]

                    #include <limits.h>

                    /* min_follow : teste si 'A' et 'B' se suivent dans le bon ordre dans
                                        la table de caractères implémentée ;
                                        renvoie 1 si oui, 0 sinon  */


                    int min_follow()
                    {
                        char c;
                        int temp;
                       
                        for(c = 0, temp = 0; c < SCHAR_MAX; c++)
                            if (c == 'A')
                                    temp++;
                            else if (c == 'B')
                                if (temp)
                                    if ('A' + 1 == c)
                                        return 1;
                                    else
                                        return 0;
                                else
                                    return 0;
                    }


                    Code à améliorer pour qu'il prenne plus en compte que les lettre A et B, m'enfin dans le principe je crois que c'est à peu près ça.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 mai 2006 à 11:53:03

                      Citation : mleg

                      Il faudrait vérifier que les caractères se suivent donc.


                      Il faut tester la séquence de tous les caractères. Et ça mènerai à quoi ?

                      Si ce n'est pas en séquence, tu fais quoi ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Music only !
                        4 mai 2006 à 12:28:16

                        Pourquoi pas un switch ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          4 mai 2006 à 16:35:27

                          Le plus simple et pratique quand on en a besoin, c'est de créer un char alphabet[26]; qui contient toutes les lettres et leur indice (u'on peut éventuellement décaler de 1), après on fait ce qu'on veut dessus :p
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Conversion Char > Int

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown