在C语言中,如何将一个字符串中的单个字符分配给另一个字符串?

在C语言中,如何将一个字符串中的单个字符分配给另一个字符串?,c,string,copy,C,String,Copy,我有 我想把上面字符串中的一个随机字母分配给一个名为 char alphabet[27] = {"abcdefghijklmnopqrstuvwxyz"}; 这就是我到目前为止所做的: char guess[2] 我知道这行不通,因为它会试图将整个字母表复制到guess中,对吗? 我只想把一个随机字母分配给guess,这样我就可以创建一个刽子手程序,我想让电脑猜出这个秘密单词的字母。在以前版本的程序中,我是猜字母的人,所以我只使用了 srand(time(NULL)); in

我有

我想把上面字符串中的一个随机字母分配给一个名为

char alphabet[27] = {"abcdefghijklmnopqrstuvwxyz"};
这就是我到目前为止所做的:

char guess[2]
我知道这行不通,因为它会试图将整个
字母表
复制到
guess
中,对吗? 我只想把一个随机字母分配给
guess
,这样我就可以创建一个刽子手程序,我想让电脑猜出这个秘密单词的字母。在以前版本的程序中,我是猜字母的人,所以我只使用了

    srand(time(NULL));
    int r = rand() % 28;
    char strcpy(guess, alphabet[r]);

去做吧。我希望它是一样的,但电脑猜测字母表中的随机字母。这可能吗?

放弃任何形式的strcpy:

gets(guess);

但是如果您想将其用作
char
,而不是数组,只需声明
char guess并使用它。

只要放弃任何形式的strcpy即可:

gets(guess);
但是如果您想将其用作
char
,而不是数组,只需声明
char guess并按原样使用它

我知道这行不通,因为它会把整个字母表复制到猜猜中,对吗

在“不起作用”部分正确,但在“为什么”部分不完全正确:它将尝试使用
字母[r]
作为地址,这将导致未定义的行为

获取单个
char
要简单得多-您不需要函数,可以执行以下操作:

srand(time(NULL));
int r = rand() % 26;
guess[0] = alphabet[r];
guess[1] = '\0';
就这样-一个
字符
可以通过简单的赋值复制

在以前版本的程序中,我是猜字母的人,所以我只使用了
get(guess)

这解释了为什么将
guess
声明为
char[2]
,而不是声明为
char
。在这个版本的程序中,您不需要这样做,因为您没有读取输入,所以不需要为空终止符添加额外的位置

还要注意的是,不应使用
gets
,这本身就是不安全的,因为它很容易导致缓冲区溢出。您应该改用
fgets
,因为您可以将缓冲区的大小传递给
fgets
,并确保它不会超过缓冲区的末尾

我知道这行不通,因为它会把整个字母表复制到猜猜中,对吗

在“不起作用”部分正确,但在“为什么”部分不完全正确:它将尝试使用
字母[r]
作为地址,这将导致未定义的行为

获取单个
char
要简单得多-您不需要函数,可以执行以下操作:

srand(time(NULL));
int r = rand() % 26;
guess[0] = alphabet[r];
guess[1] = '\0';
就这样-一个
字符
可以通过简单的赋值复制

在以前版本的程序中,我是猜字母的人,所以我只使用了
get(guess)

这解释了为什么将
guess
声明为
char[2]
,而不是声明为
char
。在这个版本的程序中,您不需要这样做,因为您没有读取输入,所以不需要为空终止符添加额外的位置


还要注意的是,不应使用
gets
,这本身就是不安全的,因为它很容易导致缓冲区溢出。您应该改用
fgets
,因为您可以将缓冲区的大小传递给
fgets
,并确保它不会超过缓冲区的末尾。

为什么不这样做呢

char guess = alphabet[r];

为什么不做些像这样的事情呢

char guess = alphabet[r];

正如您可以使用
字母表[index]
从数组
字母表中读取单个字符一样,您也可以使用相同的方式设置单个字符,因此:

guess[0] = alphabet[r];
要确保guess可以用作以NUL结尾的字符串,您需要确保第二个字符是NUL:

guess[0] = alphabet[r];
代码中的最后一个bug如下所示:

guess[1] = '\0';

28需要替换为26(只有26个有效值)。

正如您可以使用
字母表[index]
从数组
字母表中读取单个字符一样,您也可以用相同的方式设置单个字符,因此:

guess[0] = alphabet[r];
要确保guess可以用作以NUL结尾的字符串,您需要确保第二个字符是NUL:

guess[0] = alphabet[r];
代码中的最后一个bug如下所示:

guess[1] = '\0';

28需要替换为26(只有26个有效值)。

您的字母表中有多少个字母?我使用的全英文字母表有27个字母。您确定吗?您的字母表中有多少个字母?我使用的全英文字母表有27个字母。您确定吗?加上
guess[1]='\0'如果你不想让一个以NUL结尾的stringplus
guess[1]='\0'如果您不想使用以NUL结尾的字符串