我是 C 编程的新手,我被赋予了创建一个二维数组的任务,该数组使用 random () 函数存储来自 AZ 的随机字母。我知道如何做随机数。
nextvalue = random ( ) % 10001;
但我不确定如何准确地创建一个随机字符。我知道您可以使用 ASCII 使用 ASCII 表中的 65 - 90 范围创建随机字符。谁能帮我想出一个解决方案?我将不胜感激。
您应该对系统的字符编码进行一些假设。假设它是ASCII或UTF-8,让我们将自己限制为拉丁字母表的 26 个大写字母ABC...XYZ。
然后你可以编码:
char randomletter = 'A' + (random() % 26);
这不适用于EBCDIC。你也可以试试
char randomletter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[random () % 26];
它适用于任何编码(包括EBCDIC、ASCII、UTF-8、ISO-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
......)。同样,我相信并了解到西里尔软符号 ь
不是一封信,即使它看起来像一个。用阿拉伯语、希伯来语、韩语、切诺基语、泰语定义什么是字母……也应该很有趣,而且是无休止的辩论……
我想你已经解决了这个问题。你只需要更加努力地思考和修补它。在 C 中,您可以轻松地以 Dec 格式显示任何 ASCII 字符。这是供参考的ASCII表。例如
char c = 65;
char c = 'A'; // Both are the same thing.
所以它可能与生成 65 到 90 之间的随机数相同。希望这会有所帮助;)我也是 C 的新手,有一些 C++ 的背景。