我正在尝试用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”,这完全是拧紧程序。我可以在调试时看到这个。
为什么会这样?任何帮助表示赞赏!
答案 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}}。