0

ランダムな長さのランダムな文字列を返す関数の作業コードが必要です。

私がやりたいことは、次のコードでより適切に記述されます。

char *getRandomString()
{
    char word[random-length];
    // ...instructions that will fill word with random characters.
    return word;
}
void main()
{
    char *string = getRandomString();
    printf("Random string is: %s\n", string);
}

このため、 stdio.h以外のインクルードを使用することは固く禁じられています。編集:このプロジェクトはPICマイクロコントローラー用にコンパイルされるように調整されるため、malloc()などは使用できません。ここでstdio.hを使用する理由は、 GCCを使用して出力を検査できるようにするためです。

現在、このコードはこのエラーを出します。-
「警告:関数はローカル変数のアドレスを返します[デフォルトで有効]」</ p>

それで、これでうまくいくと思いました。-

char *getRandomString(char *string)
{
    char word[random-length];
    // ...instructions that will fill word with random characters.
    string = word;
    return string;
}
void main()
{
    char *string = getRandomString(string);
    printf("Random string is: %s\n", string);
}

しかし、それは意味のない文字の束を印刷するだけです。

4

5 に答える 5

4

これを行う一般的な方法は3つあります。

  1. 呼び出し元に、データが格納される配列(の最初の要素)へのポインターを、長さパラメーターとともに渡してもらいます。返される文字列が渡された長さよりも大きい場合、それはエラーです。あなたはそれにどう対処するかを決める必要があります。(結果を切り捨てるか、nullポインターを返すことができます。いずれにしても、呼び出し元はそれを処理できる必要があります。)

  2. 新しく割り当てられたオブジェクトへのポインタを返します。これにより、完了時に呼び出すのは呼び出し元の責任になりますfree。失敗した場合はおそらくnullポインタを返しmalloc()ます(これは常に可能性があり、常にチェックする必要があります)。mallocfreeがこれで宣言されているので、<stdlib.h>あなたの(人工的な)要件を満たしていません。

  3. 静的配列(の最初の要素)へのポインタを返します。これにより、ローカルに割り当てられたオブジェクトへのポインタを返すエラーが回避されますが、独自の欠点があります。これは、後の呼び出しで元の結果が壊れるということを意味し、固定の最大サイズを課します。

これらが理想的な解決策である場合はありません。

于 2011-08-25T17:49:31.633 に答える
2

ローカルアドレスを返すため、意味のない文字を指します。char word[random-length];ローカルに定義されていますchar *getRandomString(char *string)

文字列を動的に割り当て、文字列をmalloc入力し、返されたアドレスを。で返しますmalloc。この返されたアドレスはヒープから割り当てられ、手動で解放しない(またはプログラムが終了しない)まで割り当てられます。

char *getRandomString(void)
{
    char *word;
    word = malloc (sizeof (random_length));
    // ...instructions that will fill word with random characters.
    return word;
}

割り当てられた文字列を使い終わったら、文字列を解放することを忘れないでください。

または、プログラムが実行されている限り、静的に宣言された配列の存続期間を作成するmallocローカル文字列を定義するを使用できない場合は、別のことを行うことができます。getRandomStringstatic

char *getRandomString(void)
{
    static char word[LENGTH];
    // ...instructions that will fill word with random characters.
    return word;
}

または、単にchar word[128];グローバルにします。

于 2011-08-25T17:44:23.520 に答える
0

どちらの例も、ローカル変数へのポインターを返しています。これは通常、ノーノーです。malloc()で定義されていない、なしで呼び出し元が使用するメモリを作成することはできません。したがって、宣言してランダムな文字列へのポインタを渡すことができない限り、静的またはグローバルにstdio.hするしか選択肢はないと思います。記入する関数。の関数だけで乱数をどのように生成しますか?wordmain()stdio.h

于 2011-08-25T17:45:47.653 に答える
0

私が理解しているように、mallocはオプションではありません。

a)ランダムな整数(文字列の長さ)を取得し、b)ランダムな文字を取得するためにいくつかの関数を記述します。

次に、それらを使用してランダムな文字列を作成します。

例えば:

//pseudocode
static char random_string[MAX_STRING_LEN];
char *getRandomString()
{
    unsigned int r = random_number();

    for (i=0;i<r;i++){
        random_string[i] = random_char();
    }

    random_string[r-1] = '\0';
}
于 2011-08-25T17:48:08.667 に答える
0

使用が許可されていない場合はmalloc、ファイルスコープで可能な最大サイズの配列を宣言し、ランダムな文字で埋める必要があります。

#define MAX_RANDOM_STRING_LENGTH  1024
char RandomStringArray[MAX_RANDOM_STRING_LENGTH];

char *getRandomString(size_t length)
{
  if( length > ( MAX_RANDOM_STRING_LENGTH - 1 ) ) {
    return NULL; //or handle this condition some other way

  } else {
    // fill 'length' bytes in RandomStringArray with random characters.
    RandomStringArray[length] = '\0';
    return &RandomStringArray[0];

  }
}

int main()
{
    char *string = getRandomString(100);
    printf("Random string is: %s\n", string);

    return 0;
}
于 2011-08-25T17:48:59.853 に答える