Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C为ASCII的随机数,为什么这个代码是错误的?_C - Fatal编程技术网

C为ASCII的随机数,为什么这个代码是错误的?

C为ASCII的随机数,为什么这个代码是错误的?,c,C,我尝试使用rand()函数从A到G随机生成字符,添加65使数字范围从65到71,并将其转换为char值 但是,当我尝试运行此操作时,会出现一个错误,提示“在标记之前需要表达式” 我不太确定我的代码行在语法方面犯了什么错误 char generateRandom(void) { time_t t; srand((unsigned) time(%t)); char choice = (char) rand() % 5 + 65; return choice; } 应该是: sr

我尝试使用rand()函数从A到G随机生成字符,添加65使数字范围从65到71,并将其转换为char值

但是,当我尝试运行此操作时,会出现一个错误,提示“在标记之前需要表达式”

我不太确定我的代码行在语法方面犯了什么错误

char generateRandom(void)
{
  time_t t;
  srand((unsigned) time(%t));

  char choice = (char) rand() % 5 + 65;

  return choice;
}
应该是:

srand((unsigned) time(%t));
//                    ^
%
运算符是一个二进制运算符(
a%b
),它尝试查找模数(将
a
除以
b
时的余数)。
&
运算符是一元运算符(
&a
),它为您提供指向
a
对象的指针。您需要在这里使用后者(但请参见下文,因为您实际上根本不需要使用它)

您还有一些其他问题,其中包括:

  • 您应该为随机数生成器设定一次种子(可能在
    main()
    ),而不是每次需要随机数时

  • 您可以使用
    srand(time(0))
    对其进行种子设定,因为传递NULL意味着您不想存储时间。对于这种情况,不需要创建
    t
    变量

  • 表达式
    number%5
    将为您提供一个从
    0
    4
    的值。这只会通过
    E
    传递
    A
    。您应该使用
    7

  • 如果您添加
    'A'
    而不是魔法数字
    65
    ,您的代码将更具可读性

  • 无需将结果强制转换为字符,在任何情况下,您只需将
    rand()
    的结果与您拥有的代码一起强制转换(与
    %
    一起,在默认情况下签名为
    char
    的环境中,可能会导致负数)。如果要强制转换,应该将整个表达式包含在括号中,但我建议完全删除强制转换

另一方面,为了实现完全的可移植性,您甚至不应该假设字母是连续的,因为标准只保证
0-9
的字母是连续的,其他什么都没有

如果你是那种担心这类事情的人,你最好使用以下方法:

srand((unsigned) time(&t));
//                    ^

改变这两行

char genRandom (void) {
    return "ABCDEFG"[rand() % 7]; // assume srand already called.
}


请尝试以下代码,它将在gcc上工作:

srand((unsigned) time(&t));
char choice = (char) (rand() % 7 + 65); // or remove the cast
#包括
#包括
#包括
main()
{
srand(时间(空));
字符rc=(字符)(rand()%7)+65;
printf(“%c”,rc);
}

在这一行附近发布更多的代码。
标记前的预期表达式“
此错误不是来自这一行。错误在别处。这是函数中除了返回该值之外的唯一代码。
%
==>
&
。。。。。(无论如何,这不是为prng设定种子的地方,每次进程运行都应该执行一次,最好在第一次使用
rand()
之前的
main()
开始时执行)。
srand((未签名)时间(%t))
这一行。他将%改为a&,以防你注意不到。投票赞成成为第一个指出使用“a”而不是65更好的人。@cWallenpole,我看不到这方面的证据。无论如何,他发布的代码显然有这个问题,在我列出的其他代码中。没有投票赞成不注意演员阵容。见answer of@haccks@rici,我不打算包括每一个小东西,只包括主要的东西。为什么我们现在不假设生成器实际上是基于白噪声的,完全随机的,并且
RAND_MAX
是七的倍数:-)
srand((unsigned) time(&t));
char choice = (char) (rand() % 7 + 65); // or remove the cast
#include <stdio.h>
#include <string.h>
#include <time.h>
main()
{
   srand(time(NULL));
   char rc=(char)(rand()%7)+65;
   printf("%c",rc);
}