char generateRandom(void)
{
time_t t;
srand((unsigned) time(%t));
char choice = (char) rand() % 5 + 65;
return choice;
}
我正在尝试使用 rand() 函数随机生成从 A 到 G 的字符,添加 65 使数字范围为 65 到 71,并将其转换为 char 值。
当我尝试运行它时,我收到一条错误消息,提示“ token 前的预期表达式”。
我不太确定我的代码行在语法方面做错了什么。
最佳答案
srand((unsigned) time(%t));
// ^
应该是:
srand((unsigned) time(&t));
// ^
%
运算符是一个二进制运算符 (a % b
),它试图找到模数(当您将 a
除以时的余数b
)。 &
运算符是一元运算符 (&a
),它为您提供指向 a
对象的指针。您需要在此处使用后者(但请参阅下文,因为您实际上根本不需要使用它)。
您还有其他一些问题,其中包括:
您应该为随机数生成器一次播种(可能在
main()
中),而不是每次您想要一个随机数时。您可以使用
srand (time (0))
作为种子,因为传递 NULL 意味着您不想存储时间。对于这种情况,无需创建t
变量。表达式
number % 5
将为您提供从0
到4
的值(含)。这只会通过E
传递A
。您应该使用7
。如果您添加
'A'
而不是魔数(Magic Number)65
,您的代码将更具可读性。没有需要将您的结果转换为一个字符,并且在任何情况下,您只需将
rand()
的结果转换为代码你有(与%
一起,在char
默认签名的环境中可能会导致负数)。如果你想转换它,你应该将整个表达式包含在括号中,但我建议完全删除转换。
顺便说一句,为了完整 的可移植性,您甚至不应该假设字母是连续的,因为标准只保证 0-9
而不是其他。
如果你是那种担心这类事情的人,你最好使用类似的东西:
char genRandom (void) {
return "ABCDEFG"[rand() % 7]; // assume srand already called.
}
关于C Random numbers for ASCII,为什么这段代码是错误的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25904204/