C Random numbers for ASCII,为什么这段代码是错误的?

标签 c

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 将为您提供从 04 的值(含)。这只会通过 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/

相关文章:

c - 垃圾而不是字符串显示

c - 从c中的文件中读取十六进制值

创建加载动画

c - PMAP/动态加载库的使用 (C/Linux)

c - 在 Intel 机器上构建 Apple Silicon 二进制文件

c - 当非静态函数声明跟在静态函数声明之后会发生什么?

c - 分配时不兼容的类型 - 系统日期的 C 程序

c - Xlib 中的 xcb_shm_get_image 等价物

c - 生成没有指针的大写字母

c - 忽略信号的不同方法?