0

40 個のランダムな大文字で配列を埋める関数を作成しようとしています。配列を埋めて印刷しようとしましたが、出力が得られません。

前もって感謝します。

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

void fillS1(char y[]);

int main(int argc, const char * argv[])
{
char s1[40];
int n;

fillS1(&s1[40]);

for (n = 0; n < 41; n++) {
    printf("%s", s1);
}


return 0;
}

void fillS1(char y[40]){

int x = 1;

while (x < 41) {
    x = rand() % 26;
    x = 2 + 'A';
    x = y[x];
    x++;
}


}
4

3 に答える 3

3

コーディングするだけです

void fill_string_40(char str[])
{
   for (int i=0; i<40; i++)
     str[i] = 'A' + random() % 26;
   str[40] = (char)0; // (char)0 is equal to use '\0'
}

そしてそれを(例えばあなたのmain)として使用します

{ char s[41];
  fill_string_40(s);
  printf("%s\n", s);
}

null終了文字には追加のバイトが必要であることに注意してください。広告私たちはいくつかのASCII互換のcharエンコーディングを想定しています。よりポータブルな方法は

str[i] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[random() % 26];

リテラル文字列は文字の定数配列であるためです。

C ++でコーディングする場合は、標準の<random>ヘッダーファイルを参照してください。Linux用にコーディングする場合は、random(4)getrandom(2)を参照してください。おそらく、 srandom(3)と一緒に使用してください。メルセンヌツイスターについても読む

于 2012-10-16T05:16:32.213 に答える
2

これを試してみてください。プログラムの最初のどこかで srand() を呼び出すことを忘れないでください。

void fillRand(char ar[], size_t len)
{
    size_t i=0;
    if (0 == len)
        return;

    for (i=0;i<(len-1);++i)
       ar[i] = (rand() % 26) + 'A';
    ar[len-1] = 0;
}       

ところで、仕様では「A」..「Z」が連続的または連続的であることを要求していないため、完全に移植性がありませんが、おそらく必要なものには問題なく機能します。絶対的な移植性が必要な場合は、次のものが常に機能します。

void fillRand(char ar[], size_t len)
{
    static const char a[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    size_t i=0;

    if (0 == len)
        return;

    for (i=0;i<(len-1);++i)
       ar[i] = a[ (rand() % (sizeof(a)-1)) ];
    ar[len-1] = 0;
}       

通常のプラットフォームと EBCDIC プラットフォームの両方で動作します。(違いがわからない場合は、これを使用してください)。

于 2012-10-16T05:22:12.527 に答える
0

また、呼び出し時に最初の文字のアドレスを渡す必要がありますfillS1()fillS1(&s1[40]);と置き換えますfillS1(&s1[0]);

于 2012-10-16T05:21:36.380 に答える