我是C语言编程的新手,我们的任务是创建一个2D数组,使用random()函数存储来自A-Z的随机字母。我知道如何做随机数。
nextvalue = random ( ) % 10001;
但我不确定如何创建一个随机字符。我知道您可以使用ASCII在ASCII表中使用范围65 - 90创建随机字符。任何人都可以帮我提出解决方案吗?我将不胜感激。
答案 0 :(得分:26)
您应该假设您的系统的字符编码。我们假设它是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
编码。
但this是一个有趣的答案,解释了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” in法语 - 拼写错误),但有些人认为相反。通常带有é
或à
的重音字母被认为是法语字母(但是他们的UTF-8编码需要几个连续char
....)。同样地,我相信并且已经知道西里尔文soft-sign ь
不是一封信,即使它看起来像一个。定义arabic,hebrew,korean,cherokee,thai中的字母也应该是有趣的,并且无休止的辩论......
答案 1 :(得分:1)
我想你已经解决了这个问题。你只需要更加努力思考并加以修补。 在C中,您可以轻松地以Dec形式显示任何ASCII字符。 以下是ASCII Table供参考。 例如
char c = 65;
char c = 'A'; // Both are the same thing.
所以它可能与生成65到90之间的随机数相同。希望这有帮助;)我也是C的新手,有一些C ++背景。