我数组的第一个字符没有打印出来

时间:2019-02-23 03:04:36

标签: c arrays

我想编写一个《 Hangman》游戏,但是在比较字符串等之前。我只是想自动滚动浏览数组以查看它是否有效-它不如我想象的那样好。

除了第一个字符之外的所有内容都被打印出来了,为什么?

int gameWon = 0;
char secretWord[7][1] = {{"H"},{"A"},{"N"},{"G"},{"M"},{"A"},{"N"}};
char guessedChar;

while(gameWon != 1)
{
    printf("Guess a single letter: ");
    scanf("%s", &guessedChar);

    for(int i = 0; i < 7; i++)
    {
            printf("%c\n", secretWord[i][0]);
    }
}

2 个答案:

答案 0 :(得分:2)

您对scanf使用了错误的格式说明符:

scanf("%s", &guessedChar);

%s格式说明符期望char *指向char数组的第一个元素,并在该位置放置一个空终止的字符串。您传入的是单个char的地址。这导致scanf写入guessedChar的存储位置,并调用undefined behavior。在这种情况下,它表现为附近的变量被覆盖,特别是数组secretWord的第一个元素。

将其更改为使用%c代替,它用于读取单个字符。另外,请确保在格式字符串前放置一个空格,以吸收输入缓冲区中剩余的所有空白字符:

scanf(" %c", &guessedChar);

答案 1 :(得分:2)

您在scanf中指定的类型是错误的,您将地址传递给字符,但是格式说明符%s需要一个字符串,这将导致未定义的行为。我的猜测是,它会影响其余的代码。

secretword的类型似乎有点奇怪,为什么不只是数组或字符串?

char secretWord[] = "HANGMAN";

scanf不是从键盘上读取的好选择,而是使用fgets()并去除结尾的\ n,或者像您这样,只需读取第一个字符。然后,您无需处理scanf在键盘缓冲区中保留字符的事实。

while (... )
{
    printf("Guess a single letter: ");
    char buffer[128];
    if (fgets(buffer,sizeof(buffer),stdin) != NULL)
    {
      for (int i = 0; i < strlen(secretWord); ++i)
      {
        if (buffer[0] == secretWord[i])
        {
        ...
        }
      }