7

我是 C 编程的新手,我被赋予了创建一个二维数组的任务,该数组使用 random () 函数存储来自 AZ 的随机字母。我知道如何做随机数。

nextvalue = random ( ) % 10001;

但我不确定如何准确地创建一个随机字符。我知道您可以使用 ASCII 使用 ASCII 表中的 65 - 90 范围创建随机字符。谁能帮我想出一个解决方案?我将不胜感激。

4

2 回答 2

33

您应该对系统的字符编码进行一些假设。假设它是ASCIIUTF-8,让我们将自己限制为拉丁字母表的 26 个大写字母ABC...XYZ

然后你可以编码:

 char randomletter = 'A' + (random() % 26);

这不适用于EBCDIC。你也可以试试

 char randomletter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[random () % 26];

它适用于任何编码(包括EBCDICASCIIUTF-8ISO-Latin-1)......其中每个A...Z字母由单个char.

但这是一个有趣的答案,解释了为什么random() % 26错误的。在我幼稚的非专家看来,这已经足够了。

用我们定义random() % 26的地方替换myrandomlt26()

static inline unsigned myrandomlt26() {
   long l;
   do { l = random(); } while (l>=(RAND_MAX/26)*26);
   return (unsigned)(l % 26);
}

应该稍微好一点(上面的do...while循环通常应该运行一次)。

但是,如果了解更多关于Unicode的信息,您会发现在某些人类语言中,字母(或大写)的概念并不像您想象的那么简单。

我不是这些问题的专家,但都市传说说奇怪的是法语œ不是字母(而只是连字),因为在某些 ISO 会议上讨论它时,法国代表生病了。在法国学校,我记得(可能在 1966 年至 1972 年)知道它不是字母(但不是手写的连字 - 在法语中有一个特殊的名称“E dans l'O” - 是一个拼写错误) ,但也有人认为相反。通常重音字母像é或被à认为是法语中的字母(但它们的 UTF-8 编码需要几个连续的char......)。同样,我相信并了解到西里尔软符号 ь不是一封信,即使它看起来像一个。用阿拉伯语希伯来语韩语切诺基语泰语定义什么是字母……也应该很有趣,而且是无休止的辩论……

于 2013-11-01T09:54:45.163 回答
1

我想你已经解决了这个问题。你只需要更加努力地思考和修补它。在 C 中,您可以轻松地以 Dec 格式显示任何 ASCII 字符。这是供参考的ASCII表。例如

char c = 65;
char c = 'A'; // Both are the same thing.

所以它可能与生成 65 到 90 之间的随机数相同。希望这会有所帮助;)我也是 C 的新手,有一些 C++ 的背景。

于 2013-11-01T10:06:31.420 回答