1

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 は double float base math を使用しています。

4

6 に答える 6

4

Alongは、どのプラットフォームでも 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 回呼び出すよりも速く、エラーが発生しにくくなります。

于 2010-06-08T16:06:47.763 に答える
3
int charsRequired = snprintf(NULL, 0, "%ld", value) + 1;
char *long_str_buffer = malloc(charsRequired);
snprintf(long_str_buffer, charsRequired, "%ld", value);
于 2010-06-08T16:09:04.173 に答える
2

最大桁数は。で与えられ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()ます。

于 2010-06-08T18:58:13.693 に答える
1

free関数のユーザーがある時点で呼び出す必要があるかどうかは明らかではないため、多くの人はこのアプローチを避けることをお勧めします。通常のアプローチは、提供されたバッファに書き込むことです。

于 2010-06-08T16:12:36.353 に答える
0

longを受け取るので、範囲は–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:メモリの割り当てを簡素化し、この「ツールボックス」機能以上のものを解放したいと思います。

于 2010-06-08T16:16:26.317 に答える
0

charプリプロセッサを使用して、整数型のテキスト形式を保持するために必要なの数の上限を計算できます。次の例は、符号付きおよび符号なしの型 (例: MAX_SIZE(int)) に対して機能し、終端\0および可能なマイナス記号のための余地を残します。

#define MAX_SIZE(type) ((CHAR_BIT * sizeof(type)) / 3 + 2)
于 2010-06-09T00:33:20.887 に答える