【问题标题】:How to assign a single character from a string to another string in C?如何将字符串中的单个字符分配给C中的另一个字符串?
【发布时间】:2014-05-22 16:04:08
【问题描述】:

我有

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 字符串中猜测随机字母。这可能吗?

【问题讨论】:

  • 你的字母表中有多少个字母?
  • 我使用整个英文字母,所以 27 个字母。
  • 你确定吗?

标签: c string copy


【解决方案1】:

放弃任何形式的strcpy

srand(time(NULL));
int r = rand() % 26;
guess[0] = alphabet[r];
guess[1] = '\0';

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

【讨论】:

    【解决方案2】:

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

    在“不会工作”上是正确的,但在为什么部分上并不完全正确:它将尝试使用alphabet[r] 作为地址,这将导致未定义的行为。

    获取单个char 比这简单得多 - 你不需要函数,你可以这样做:

    char guess = alphabet[r];
    

    就是这样 - 一个 char 可以通过简单的赋值来复制。

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

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

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

    【讨论】:

      【解决方案3】:

      为什么不做类似的事情

      guess[0] = alphabet[r];
      

      ?

      【讨论】:

      • 加上 guess[1] = '\0'; 如果你想要一个 NUL 终止的字符串
      【解决方案4】:

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

      guess[0] = alphabet[r];
      

      为确保guess 可以用作以NUL 结尾的字符串,您需要确保第二个字符为NUL:

      guess[1] = '\0';
      

      您的代码中的最后一个错误位于以下行中:

      int r = rand() % 28;
      

      需要将28换成26(有效值只有26个)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-17
        • 2015-09-15
        • 1970-01-01
        相关资源
        最近更新 更多