在c中生成随机字符

时间:2013-11-01 09:51:07

标签: c random character

我是C语言编程的新手,我们的任务是创建一个2D数组,使用random()函数存储来自A-Z的随机字母。我知道如何做随机数。

nextvalue = random ( ) % 10001;

但我不确定如何创建一个随机字符。我知道您可以使用ASCII在ASCII表中使用范围65 - 90创建随机字符。任何人都可以帮我提出解决方案吗?我将不胜感激。

2 个答案:

答案 0 :(得分:26)

您应该假设您的系统的字符编码。我们假设它是ASCIIUTF-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 ь 不是一封信,即使它看起来像一个。定义arabichebrewkoreancherokeethai中的字母也应该是有趣的,并且无休止的辩论......

答案 1 :(得分:1)

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

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

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