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);
}

请注意,空终止字符需要一个额外的字节。我们假设一些 ASCII 兼容的字符编码。一种更便携的方式可能是

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

因为文字字符串是字符的常量数组。

如果您使用 C++ 编写代码,请参阅标准<random>头文件。如果您为 Linux 编写代码,请参阅random(4)getrandom(2),也许将它与srandom(3)一起使用。另请阅读有关Mersenne Twister的信息

于 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 回答