違い intをCで文字列に変換する




char to int c++ (10)

通常、 snprintf()は次のような方法です:

char str[16]; // could be less but i'm too lazy to look for the actual the max length of an integer
snprintf(str, sizeof(str), "%d", your_integer);

intstringに変換するitoa()関数を使用していstringが、エラーが発生しています:

undefined reference to `itoa'
collect2: ld returned 1 exit status

理由は何ですか? この変換を実行する他の方法はありますか?


snprintf使用してください - これはすべてのコンパイラで利用可能な標準です。 NULL, 0パラメータでそれを呼び出すことによって必要なサイズを問い合わせます。 末尾に1文字以上のヌルを割り当てます。

int length = snprintf( NULL, 0, "%d", x );
char* str = malloc( length + 1 );
snprintf( str, length + 1, "%d", x );
...
free(str);

snprintf使用すると、 itoaよりも移植性がitoaます。

itoaは標準Cの一部ではなく、標準C ++の一部でもありません 。 しかし、多くのコンパイラと関連するライブラリがそれをサポートしています。

sprintf

char* buffer = ... allocate a buffer ...
int value = 4564;
sprintf(buffer, "%d", value);

snprintf

char buffer[10];
int value = 234452;
snprintf(buffer, 10, "%d", value);

どちらの関数もfprintfと似ていますが、出力はストリームではなく配列に書き込まれます。 sprintfsnprintfの違いは、 snprintfはバッファに格納できる最大文字数まで書き込むことでバッファオーバーランが発生しないことです。


void itos(int value, char* str, size_t size) {
    snprintf(str, size, "%d", value);
}

.. 参照による呼び出しで動作します 。 このように使用してください:

int someIntToParse;
char resultingString[length(someIntToParse)];

itos(someIntToParse, resultingString, length(someIntToParse));

今のresultingString StringはあなたのC文字列を保持します。


Ahmad Sirojuddinと同様の実装ですが、わずかに異なるセマンティクスです。 セキュリティの観点からは、関数が文字列バッファに書き込むたびに、関数はバッファのサイズを実際に知っていて、バッファの終わりを過ぎて書き込むことを拒否する必要があります。 私はもうitoaを見つけることができない理由の一部を推測するでしょう。

また、次の実装は、モジュール/ devide操作を2回実行することを回避します。

char *u32todec( uint32_t    value,
                char        *buf,
                int         size)
{
    if(size > 1){
        int i=size-1, offset, bytes;
        buf[i--]='\0';
        do{
            buf[i--]=(value % 10)+'0';
            value = value/10;
        }while((value > 0) && (i>=0));
        offset=i+1;
        if(offset > 0){
            bytes=size-i-1;
            for(i=0;i<bytes;i++)
                buf[i]=buf[i+offset];
        }
        return buf;
    }else
        return NULL;
}

次のコードは、上記のコードをテストし、その正しさを示しています。

int main(void)
{
    uint64_t acc;
    uint32_t inc;
    char buf[16];
    size_t bufsize;
    for(acc=0, inc=7; acc<0x100000000; acc+=inc){
        printf("%u: ", (uint32_t)acc);
        for(bufsize=17; bufsize>0; bufsize/=2){
            if(NULL != u32todec((uint32_t)acc, buf, bufsize))
                printf("%s ", buf);
        }
        printf("\n");
        if(acc/inc > 9)
            inc*=7;
    }
    return 0;
}

sprintf()をよく使う

char stringNum[20];
int num=100;
sprintf(stringNum,"%d",num);

私が続行する前に、 itoaはANSI関数ではないことを警告しなければなりません。標準的なC関数ではありません。 intを文字列に変換するには、 sprintfを使用する必要があります。

itoaは3つの議論を要する。

  • 最初のものは変換される整数です。
  • 2番目の文字は文字配列へのポインタです。これが文字列が格納される場所です。 char *変数を渡すと、プログラムがクラッシュする可能性があるので、通常のサイズのchar配列を渡す必要があり、うまくいきます。
  • 最後のものは配列のサイズではありませんが、それはあなたの番号のベースです - ベース10はあなたが最も使用する可能性の高いものです。

この関数は、変換された文字列を格納している2番目の引数へのポインタを返します。

itoaは非常に便利な関数です。これはいくつかのコンパイラによってサポートされています - それはatoiとは異なり、すべてがサポートしていないことは残念atoi

まだitoaを使用したい場合は、ここでどのように使用する必要があります。 それ以外の場合は、 sprintfを使用する別のオプションがあります(ベースsprintf 、または16の出力が必要な場合)。

char str[5];
printf("15 in binary is %s\n",  itoa(15, str, 2));

char string[something];
sprintf(string, "%d", 42);

この機能を使って自分のitoaを作ることができます:

void my_utoa(int dataIn, char* bffr, int radix){
int temp_dataIn;
temp_dataIn = dataIn;
int stringLen=1;

while ((int)temp_dataIn/radix != 0){
    temp_dataIn = (int)temp_dataIn/radix;
    stringLen++;
}
//printf("stringLen = %d\n", stringLen);
temp_dataIn = dataIn;
do{
    *(bffr+stringLen-1) = (temp_dataIn%radix)+'0';
    temp_dataIn = (int) temp_dataIn / radix;
}while(stringLen--);}

これは例です:

char buffer[33];
int main(){
  my_utoa(54321, buffer, 10);
  printf(buffer);
  printf("\n");

  my_utoa(13579, buffer, 10);
  printf(buffer);
  printf("\n");
}

本当に itoaを使用する場合は、標準ライブラリヘッダーをインクルードする必要があります。

#include <stdlib.h>

私はまた、あなたがWindows(MSVCを使用して)上にいる場合、 itoaは実際に_itoaだと考えています。

http://msdn.microsoft.com/en-us/library/yakksftt(v=VS.100).aspx参照してhttp://msdn.microsoft.com/en-us/library/yakksftt(v=VS.100).aspx

そして、 collect2からメッセージをcollect2 、* nixでGCCを実行している可能性が高いです。





c