2017-03-22 2 views
0

Je suis en train de convertir un long long non signé en une chaîne sans utiliser de fonctions de bibliothèque comme sprintf() ou ltoi(). Le problème est que lorsque je renvoie la valeur, il ne retourne pas correctement, si je n'ai pas printf() dans ma fonction avant de le renvoyer à la fonction d'appel.Convertir long long int en chaîne sans sprintf en utilisant les fonctions

#include <stdio.h> 
#include <stdlib.h> 

char *myBuff; 

char * loToString(unsigned long long int anInteger) 
{ 
    int flag = 0; 
    char str[128] = { 0 }; // large enough for an int even on 64-bit 
    int i = 126; 

    while (anInteger != 0) { 
     str[i--] = (anInteger % 10) + '0'; 
     anInteger /= 10; 
    } 

    if (flag) str[i--] = '-'; 

    myBuff = str+i+1; 
    return myBuff; 
} 

int main() { 
    // your code goes here 

    unsigned long long int d; 
    d= 17242913654266112; 
    char * buff = loToString(d); 

    printf("chu %s\n",buff); 
    printf("chu %s\n",buff); 


    return 0; 

} 
+0

'char str [128] = {0};' Il ne peut pas être utilisé en dehors de la portée. – BLUEPIXY

+0

En d'autres termes 'mybuff' pointe vers la mémoire qui a été détruite quand' loToString' est revenu. (le cadre de la pile de fonctions est détruit/relâché dans le pool de mémoire lorsque la fonction revient). Allouez 'mybuff' avant de passer à' loToString' ou dynamiquement dans 'loToString'. –

+0

Remarque utilisez une variable booléenne pour les indicateurs booléens. – Olaf

Répondre

1

Je MODIFIÉ quelques points

  • str devraient être allouées dynamiquement ou devraient avoir une portée mondiale. sinon, sa portée se terminera après l'exécution de loToString() et vous renvoyez une adresse du tableau str.
  • char *myBuff est déplacé dans la portée locale. Les deux sont bien. Mais pas besoin de le déclarer globalement.

Vérifiez le code modifié.

char str[128]; // large enough for an int even on 64-bit, Moved to global scope 

    char * loToString(unsigned long long int anInteger) 
    { 
     int flag = 0; 
     int i = 126; 
     char *myBuff = NULL; 

     memset(str,0,sizeof(str)); 
     while (anInteger != 0) { 
      str[i--] = (anInteger % 10) + '0'; 
      anInteger /= 10; 
     } 

     if (flag) str[i--] = '-'; 

     myBuff = str+i+1; 
     return myBuff; 
    }