2017-03-22 15 views
0

sprintf()またはltoi()のようなライブラリ関数を使用せずに、符号なしlong long intを文字列に変換しようとしています。 問題は、呼び出し元の関数に返す前に関数内にprintf()が含まれていなければ、正しく返されないということです。関数を使用してsprintfなしでlong long intを文字列に変換する

#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};'これはスコープ外では使用できません。 – BLUEPIXY

+0

つまり、 'mybuff'は' loToString'が返されたときに破壊されたメモリを指しています。 (関数スタックフレームは、関数が返ってきたときに、メモリプールに破棄され/解放されます)。 'loToString'に渡す前に' mybuff'を割り当てるか、 'loToString'の中で動的に割り当てます。 –

+0

注ブール値フラグにはブール変数を使用してください。 – Olaf

答えて

1

Iが変更いくつかのポイント

  • strは、動的に割り当てられるべきか、グローバルスコープであるべきです。そうでなければ、そのスコープはloToString()の実行後に終了し、str配列からアドレスを返します。
  • char *myBuffは、ローカルスコープに移動されます。どちらも問題ありません。しかし、それを世界的に宣言する必要はありません。

変更されたコードを確認してください。

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; 
    } 
関連する問題