字符串值=“粘土”自动更改为“/ 000lay”?

时间:2016-04-05 09:23:46

标签: c

我正在尝试用Cows and Bulls game单词版本

制作一个C程序

这是我的代码: -

#include<stdio.h>
#include<conio.h>
void main()
{
    char word[4],guess[4];
    int i,j,check=0,b=0,c=0,d[4];
    system("cls");
    printf("Welcome to the Cows and Bulls game!\n\nEnter a 4 letter word to be guessed :- ");
    scanf("%s",word);
    while(check==0)
    {
        printf("\nEnter your guess :- ");
        scanf("%s",guess);
        for(i=0;i<4;i++)
        {
            for(j=0;j<4;j++)
            {
                if(i==j && word[i]==guess[j])
                {
                    b++;
                    d[j]=j;
                    break;
                }
                else if(word[i]==guess[j] && j!=d[j])
                {
                    c++;
                    break;
                }
            }
        }
        printf("%d cow(s) and %d bull(s)!\n",c,b);
        if(b==4)
        {
            printf("Congratulations! You have correctly guessed %s",word);
            check=1;
        }
        else
        {
            check=0;
        }
    }
    getch();
}

但我遇到的问题是假设我把“粘土”这个词猜到了,但是一旦编译器接受猜测词的值,之前给出的“粘土”这个词就会改为“/ 000lay”,这完全是拧紧程序。我可以在调试时看到这个。

Here's the image

为什么会这样?任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:5)

您最后不会为NUL终结符('\0')保留空间,当输入大于或等于4个字符时,最终通过scanf调用未定义行为。变化

char word[4],guess[4];

char word[5], guess[5];

其他建议和评论:

  • system需要stdlib.h。包括它。
  • conio.h(和getch)是非标准的。
  • void main()不是main的标准签名。请改用int main(void)。您还需要在return 0;的末尾添加main(这隐含在C99 +中)
  • 使用

    而不是scanf("%s",word);
    if(1 != scanf("%4s", word)) /* Check if `scanf` is successful; The `4` prevents buffer overflows */
    {
        fputs("scanf for word failed; Exiting...", stderr)
        exit(-1);
    }
    

    ,同样适用于scanf的{​​{1}}。

  • 最好初始化所有变量。