2016-03-29 16 views
2

私はプログラム(ネットワークサーバ - クライアント)を作りたいと思っています。 このプログラムの仕様の一つは次です:ユニークな文字列ジェネレータ

サーバが送信されたパッケージを受信し、(転送が始まる瞬間に、サーバによって生成された一意の名前で、ファイルに保存します のEx __tf_」unique_random_string。作成した独自の 『文字列」

の.txt私はへのポインタを返す関数を作った』

を、問題がある:。。私は、サーバーを停止し、再度起動した場合、それは同じ名前が生成されます

例:このファイル名が生成された後、私は停止しますdサーバー。

__ft_cdyggx.txt

__ft_arzowk.txt __ft_apqfwk.txt

私は再びそれを起動し、私は3人のファイル名を生成してみてください。それらは同じになります。

私の英語のために残念です。私はまだそれを学んでいます。

My機能は、この「一意の文字列」を生成することです:

char *create_random_name(void) 
{ 
    const char charset[] = "abcdefghijklmnopqrstuvwxyz"; 
    char *file_name; 
    int i=0; 
    int key; 
    if((file_name = malloc(16 * sizeof (char))) == NULL) 
    { 
     printf("Failed to alloc memory space\n"); 
     return NULL; 
    } 
    strcpy(file_name,"__ft_"); 
    for(i=5 ; i<11 ; i++) 
    { 
     key = rand() % (int)(sizeof(charset)-1); 
     file_name[i]=charset[key]; 
    } 
    strcat(file_name,".txt"); 
    file_name[15] = '\0'; 
    return file_name; 
} 
+0

コードに未定義の動作があります。 'file_name [16]'は有効なインデックスではありません。文字列操作関数に 'file_name'を渡した場合でも、インデックス付けは' 0から15 'に、インデックスは '15'にしておきます。 – ameyCU

+0

あなたはもっと説明できますか?私はあなたが言うことを理解していません。 –

+0

これで私を助けてもらえますか?私はすでに数時間それをgoogledと私は良い解決策を見つけませんでした。 –

答えて

0

可能であれば、衝突する可能性のあるランダムな名前を手動で生成して、システムがあなたに代わって(そして新しい名前を作成して衝突の解決を処理する)ようにするのを避けるために、mkstempsを使用します。これは、あなたがファイルを開くので、ランダムな名前が生成される危険性を排除し、一意であることを検証し、それをオープンしようとし、別のスレッド/プロセスを発見して発見するため、安全です。 mkstempsが成功した後

char name[] = "/path/to/put/files/in/__ft_XXXXXX.txt"; 
int fd = mkstemps(name, strlen(".txt")); 
if (fd == -1) { ... handle error ... } 

は、nameは(それがXXXXXX文字列を置換し、所定の位置に変異し​​ています)ファイルへのパスを保持する、とfdはその新しく作成されたファイルへの開いているファイル記述子になります。 FILE*が必要な場合はfdopenを入力してstdioタイプに変換してください。

+0

多くのテストの後に。私はその機能を削除し、私はあなたのアドバイスを使用しました。私はこれがUNIXシステムのための最善の解決策だと思っています。 –

2

一つのオプションは、ファイルに使用されている名前を保存し、チェックリストとしてそれらを使用しています。あなたはまた、srand(time(NULL))のようなものでrandをシードします。

別のものは、ランダム化を無視しています。 aaa、aab aac ... aba、abb etc.再び、あなたのサイクルがファイル上のどこに保存されているかを保存します。

+0

このsrand関数が正解かもしれません。私はそれをテストし、私は問題が解決されたと思う。 –

+0

srandはそれ自体で解決しないでしょうが、rand()サイクルが毎回同じポイントから開始するのを止めますが、指摘されているように、理論的には同じコードを得ることができます。それが使用されていないことを確認することなく、2回目です。 – Orangesandlemons

1

あなたの質問は少し不明瞭なようだが、あなたはユニークな文字列を生成したい場合は、あなたが考えることができます物事のカップルがあります。

  1. は、システムのタイムスタンプ(YYYY-MM-DD-HH-MM-ゲットSS-FFF-TT)
  2. 使用ランダム機能あなたの機能と組み合わせると、私はあなたがユニークな文字列を取得すると確信している乱数

を生成します。

希望すると助かります!

+1

こんにちは。私はsrand関数を使用し、今は動作します。御時間ありがとうございます。 –

0

乱数ジェネレータを初期化するために、srand(time())を呼び出します。

特定のファイル名で解決する前に、stat()を呼び出してファイル名が存在しないことを確認してください。

関連する問題