Partage
  • Partager sur Facebook
  • Partager sur Twitter

Convertir une chaîne en int

Fonction atoi() ? Strtol() ?

    23 novembre 2007 à 18:19:13

    Bonjour à vous amis zér0s ! :)

    Je construis actuellement un petit jeu de plateforme et j'aimerais créer une sorte de fichier lvl dans lequel j'enregistrerais la position de "briques" sous cette forme :

    2,3;3,4;25,56;\

    La, on aurait trois briques dans les positions seraient :
    (2,3) (3,4) et (25,26)

    L'anti-slash est là pour signaler une fin de lecture (j'ai d'autres idées en tête mais on s'en fiche ici).

    En gros, j'aimerais donc ouvrir le fichier, le lire et remplir deux tableaux de int : coord_x et coord_y, contenant les coordonnées des briques.
    Pour l'exemple d'au-dessus, je devrais donc avoir au final :

    coord_x[0] = 2; coord_y[0] = 3;
    coord_x[1] = 3; coord_y[1] = 4;
    coord_x[2] = 25; coord_y[2] = 25;

    Maintenant le problème ! ^^
    J'arrive parfaitement à lire le fichier et en extraire les coordonnées en type char et les enregistrer séparement dans un tableau.

    Il ne me reste plus qu'à les convertir en int pour pouvoir les utiliser mais le problème c'est qu'aucune des deux fonctions que j'utilise ne fonctionne.
    J'ai fait rapidement un petit programme en console pour pouvoir voir facilement ce qui se passe en mémoire et la fonction atoi() comme strtol() me renvoient (en travaillant en base 10) des valeurs comme ca :

    '0' --> 0
    '15' --> 18555
    '30' --> 3855

    Je ne comprends absolument pas pourquoi ça me fait ça.
    N'étant pas sur mon pc, je ne peux pas vous fournir mon code mais voici quand même l'instruction qui m'embête :
    1. printf("%ld\n", atoi(&coords_x[l]));

    l est une variable que j'incrémente réguliérement pour lire le tableau complet.

    Voilà pouvez-vous m'aider ?
    Merci d'avance ;)
    • Partager sur Facebook
    • Partager sur Twitter
      23 novembre 2007 à 18:42:11

      il faudrait plutot faire la fonction comme ça:
      1. atoi(coords_x)

      ensuite on incremente un compteur pour arriver à la fin de la chaine (ou on utilise la fonction qui compte la taille de la chaine), puis on revient charactere par charactere au début en ajoutant au total le nombre multiplié par la puissance de 10 correspondante.
      euh, c'est clair?
      • Partager sur Facebook
      • Partager sur Twitter
        23 novembre 2007 à 19:45:27

        Oui oui c'est bien ce que j'ai fait ;)
        Là c'est juste une boucle que j'ai fait pour voir ce qui se passait avec la conversion.

        Je test ta proposition tout de suite !

        EDIT : Ta solution est étrange... Ca ne m'envoie pas encore la bonne chose mais quelque chose qui s'en approche o_0 Deux fois trop de réponses o_0

        Je suis sur mon pc donc je peux vous filer mon code : (je rappelle que c'est un programme console)


        1. #include <stdio.h>
        2. #include <stdlib.h>
        3. #include <string.h>
        4. #include <math.h>
        5. #define MAX_COORDS 1000
        6. int main(int argc, char *argv[]) {
        7.     FILE* fichier = NULL;
        8.     int i = 0, j = 0, k = 0, l = 0, z = 0, mode_x = 1;
        9.     int coords_x[MAX_COORDS] = {0}, coords_y[MAX_COORDS] = {0};
        10.     char coords[MAX_COORDS] = "", coords_mem[MAX_COORDS] = "";
        11.     fichier = fopen("sol.lvl", "r");
        12.     if(fichier == NULL) {
        13.         fprintf(stderr, "Impossible d'ouvrir le fichier 'sol.lvl'.");
        14.         exit(EXIT_FAILURE);
        15.     }
        16.     fgets(coords, MAX_COORDS, fichier);
        17.     do {
        18.         if(mode_x) {
        19.             if(coords[i] == ',') {
        20.                 for(z = 0; z < l; z++) {
        21.                     coords_x[j] += atoi(&coords_mem[z]) * pow(10, l - z);
        22.                     printf("%ld\n", coords_x[j]);
        23.                 }
        24.                 l = 0;
        25.                 j++;
        26.                 mode_x = 0;
        27.             }
        28.             else {
        29.                 coords_mem[l] = coords[i];
        30.                 l++;
        31.             }
        32.         }
        33.         else {
        34.             if(coords[i] == ';') {
        35.                 for(z = 0; z < l; z++) {
        36.                     coords_y[k] += atoi(&coords_mem[z]) * pow(10, l - z);
        37.                 }
        38.                 l = 0;
        39.                 k++;
        40.                 mode_x = 1;
        41.             }
        42.             else {
        43.                 coords_mem[l] = coords[i];
        44.                 l++;
        45.             }
        46.         }
        47.         i++;
        48.     } while(coords[i] != '\\');
        49.     printf("\nChaine principale : %s\n", coords);
        50.     return 0;
        51. }

        Je sais, c'est lourd et non commenté mais ça ne marche pas encore ^^


        • Partager sur Facebook
        • Partager sur Twitter
          23 novembre 2007 à 22:28:01

          Citation : BkM


          Je suis sur mon pc donc je peux vous filer mon code : (je rappelle que c'est un programme console)
          <...>
          Je sais, c'est lourd et non commenté mais ça ne marche pas encore ^^


          Beaucoup trop complexe. Regarde strtok(), c'est fait pour les cas simples comme ça.
          • Partager sur Facebook
          • Partager sur Twitter
          Music only !
            23 novembre 2007 à 22:28:44

            chez moi ça marche avec ça:
            1. int conversion (char *texte)
            2. {
            3.     int exposant = 0, nombre = 0, i = 0 ;
            4.     while (texte[i] != '\0')
            5.         i++ ;
            6.     while (i > 0)
            7.     {
            8.         i-- ;
            9.         nombre += (texte[i] - '0') * (pow (10, exposant)) ;
            10.         exposant++ ;
            11.     }
            12.     return nombre ;
            13. }


            ça ne marche que pour les nombres entiers positifs
            • Partager sur Facebook
            • Partager sur Twitter
              24 novembre 2007 à 0:48:34

              Citation : -ed-

              Citation : BkM


              Je suis sur mon pc donc je peux vous filer mon code : (je rappelle que c'est un programme console)
              <...>
              Je sais, c'est lourd et non commenté mais ça ne marche pas encore ^^


              Beaucoup trop complexe. Regarde strtok(), c'est fait pour les cas simples comme ça.



              Effectivement, elle a l'air pratique ! :)
              Je sens que je vais alléger mon code !
              • Partager sur Facebook
              • Partager sur Twitter

              Convertir une chaîne en 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