13

mkstemp()一意のファイル名を作成するのと同じ方法でランダムな文字列を作成するライブラリ関数はありますか? それは何ですか?

4

2 に答える 2

19

標準機能はありませんが、OS が何かを実装している可能性があります。マニュアルを検索することを検討しましたか? あるいは、このタスクは簡単です。私は次のようなものを使いたくなるでしょう:

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

void rand_str(char *, size_t);

int main(void) {
    char str[] = { [41] = '\1' }; // make the last character non-zero so we can test based on it later
    rand_str(str, sizeof str - 1);
    assert(str[41] == '\0');      // test the correct insertion of string terminator
    puts(str);
}

void rand_str(char *dest, size_t length) {
    char charset[] = "0123456789"
                     "abcdefghijklmnopqrstuvwxyz"
                     "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    while (length-- > 0) {
        size_t index = (double) rand() / RAND_MAX * (sizeof charset - 1);
        *dest++ = charset[index];
    }
    *dest = '\0';
}

これには、EBCDIC システムで正しく動作し、事実上すべての文字セットに対応できるという優れた利点があります。次の文字は文字セットに追加していません。これは、ファイル名にできる文字列が必要であることは明らかであるためです。

":;?@[\]^_`{|}"

これらの文字の多くは、さまざまな OS のファイル名では無効である可能性があると考えました。

于 2013-04-02T15:39:52.327 に答える