質問

Cでそれを行うためのクリーンな方法は何ですか?

wchar_t* ltostr(long value) {
    int size = string_size_of_long(value);
    wchar_t *wchar_copy = malloc(value * sizeof(wchar_t));
    swprintf(wchar_copy, size, L"%li", self);
    return wchar_copy;
}

私がこれまでに登場したソリューションはすべてかなり醜いです。特にAllocate_Properly_size_Whar_tはダブルフロートベース数学を使用します。

役に立ちましたか?

解決

最大数桁数はによって与えられます ceil(log10(LONG_MAX)). 。あなたはこの値をの最も一般的な範囲に事前に計算することができます long プリプロセッサの使用:

#include <limits.h>

#if LONG_MAX < 1u << 31
#define LONG_MAX_DIGITS 10
#elif LONG_MAX < 1u << 63
#define LONG_MAX_DIGITS 19
#elif LONG_MAX < 1u << 127
#define LONG_MAX_DIGITS 39
#else
#error "unsupported LONG_MAX"
#endif

これで、使用できます

wchar_t buffer[LONG_MAX_DIGITS + 2];
int len = swprintf(buffer, sizeof buffer / sizeof *buffer, L"%li", -42l);

スタックに割り当てられたワイドキャラクター文字列を取得します。ヒープに割り当てられた文字列の場合は、使用してください wcsdup() 利用可能な場合、またはの組み合わせ malloc()memcpy() それ以外は。

他のヒント

a long どんなプラットフォームにも64桁以上はありません(実際にはそれよりも少ないですが、実際の最小値が何であるかを理解するにはあまりにも怠惰です)。したがって、固定サイズのバッファーに印刷するだけで、使用してください wcsdup 事前に長さを計算しようとするのではなく。

wchar_t* ltostr(long value) {
    wchar_t buffer[ 64 ] = { 0 };
    swprintf(buffer, sizeof(buffer), L"%li", value);
    return wcsdup(buffer);
}

あなたが欲しいなら char*, 、上記を翻訳するのは些細なことです。

char* ltostr(long value) {
    char buffer[ 64 ] = { 0 };
    snprintf(buffer, sizeof(buffer), "%li", value);
    return strdup(buffer);
}

これは、呼び出しよりも速く、エラーが発生しやすくなります snprintf 2回、些細な量のスタックスペースを犠牲にします。

int charsRequired = snprintf(NULL, 0, "%ld", value) + 1;
char *long_str_buffer = malloc(charsRequired);
snprintf(long_str_buffer, charsRequired, "%ld", value);

あなたの関数のユーザーが電話しなければならないことは明らかではないので、多くの人がこのアプローチを避けることをお勧めします free ある時点で。通常のアプローチは、付属のバッファーに書き込むことです。

長い間受け取るので、その範囲は-2,147,483,648から2,147,483,647になり、swprintf()はデフォルトでロケール( "c")を使用するため(その部分を制御)、11文字のみが必要です。これはあなたを救います string_size_of_long().

どちらか(ロケールcの場合):

wchar_t* ltostr(long value) {
     wchar_t *wchar_copy = malloc(12 * sizeof(wchar_t));
     swprintf(wchar_copy, 12, L"%li", value);
     return wchar_copy;
 }

またはより一般的ではあるが携帯性が低いので、使用できます _scwprintf 必要な文字列の長さを取得するには(ただし、元のソリューションに似ています)。

PS:この「ツールボックス」関数よりもメモリの割り当てと解放を簡素化します。

プリプロセッサを使用して、の数の上限を計算できます chars整数型のテキスト形式を保持するために必要です。署名型および署名されていないタイプの次の作品(例: MAX_SIZE(int))そして、終了の余地を残します \0 および可能なマイナスサイン。

#define MAX_SIZE(type) ((CHAR_BIT * sizeof(type)) / 3 + 2)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top