我有
char alphabet[27] = {"abcdefghijklmnopqrstuvwxyz"};
我希望将上面字符串中的随机字母分配给名为
的字符串char guess[2]
这是我到目前为止所做的:
srand(time(NULL));
int r = rand() % 28;
char strcpy(guess, alphabet[r]);
我知道这不会起作用,因为它会尝试将整个alphabet
复制到guess
对吗?
我只想给guess
分配一个随机字母,这样我就可以创建一个刽子手程序,我希望PC能够猜出秘密字母的字母。在该程序的先前版本中,我是那个猜字母的人所以我只是使用了
gets(guess);
去做。我希望它是相同的,但PC猜测来自alphabet
字符串的随机字母。这可能吗?
答案 0 :(得分:2)
放弃任何形式的strcpy
:
srand(time(NULL));
int r = rand() % 26;
guess[0] = alphabet[r];
guess[1] = '\0';
但是如果您想将其用作char
而不是数组,只需声明char guess;
并使用它。
答案 1 :(得分:1)
我知道这不会奏效,因为它会尝试将整个字母表复制到猜测中吗?
对于"不会工作",但不完全正确的原因部分:它会尝试使用alphabet[r]
作为地址,会导致不确定的行为。
获得单个char
要简单得多 - 你不需要一个函数,你可以这样做:
char guess = alphabet[r];
它就是 - 只需一个简单的作业即可复制一个char
。
在该程序的先前版本中,我是那个猜字母的人所以我刚用
gets(guess)
这解释了为什么您将guess
声明为char[2]
而不是char
。在这个版本的程序中你不需要像这样做,因为你没有读取输入,所以你不需要额外的空终止符。
另请注意,不应使用gets
- 它本质上是不安全的,因为它很容易导致缓冲区溢出。您应该使用fgets
,因为您可以将缓冲区的大小传递给fgets
,并确保它不会超过缓冲区的末尾。
答案 2 :(得分:1)
为什么不做一些像
这样的事情guess[0] = alphabet[r];
答案 3 :(得分:1)
正如您可以使用alphabet
从数组alphabet[index]
中读取单个字符一样,您也可以以相同的方式设置单个字符,因此:
guess[0] = alphabet[r];
为了确保猜测可以用作以NUL结尾的字符串,您需要确保第二个字符为NUL:
guess[1] = '\0';
代码中的最后一个错误如下:
int r = rand() % 28;
28需要被26替换(只有26个有效值)。