-3

人間が読めるバイト サイズ (例: 100、1k、2M、4G) をバイト値に解析する簡単な方法を探しています。入力は achar *で、出力は a でなければなりませんsize_t(たとえば、符号なし、アーキテクチャに応じて 64 ビットまたは 32 ビットの整数の可能性が高い)。コードは無効な入力を検出し、それが無効な入力であることを示す値を返す必要があります。

例:

Input  => size_t result
-----------------------
"100"  => 100
"10k"  => 10240
"2M"   => 2097152
"4G"   => 4294967296 on 64-bit machine, error (overflow) on 32-bit machine
"ten"  => error

以下は、ユニット接頭辞を処理するために展開されるコードの断片の例です。

int parse_human_readable_byte_size(char *input, size_t *result) {
    /* TODO: needs to support k, M, G, etc... */
    return sscanf("%zu", result) == 1;
}

追加の要件は次のとおりです。

  • Cで行う必要があります(C++ではありません)
  • 標準ライブラリ (または少なくとも一般的に利用可能な) ライブラリのみを使用する (例: sscanfatoi)

このコードは、プログラムの実行ごとに数回しか実行されないことが予想されるため、長い高性能コードよりも小さい可読コードが優先されます。

4

3 に答える 3

4

これが潜在的な実装です。すべてのエラーを検出するコードが含まれています。必要に応じて、s の代わりに独自の取り扱いを記入してくださいgoto

char *endp = s;
int sh;
errno = 0;
uintmax_t x = strtoumax(s, &endp, 10);
if (errno || endp == s) goto error;
switch(*endp) {
case 'k': sh=10; break;
case 'M': sh=20; break;
case 'G': sh=30; break;
case 0: sh=0; break;
default: goto error;
}
if (x > SIZE_MAX>>sh) goto error;
x <<= sh;
于 2013-04-19T15:22:19.590 に答える