我正在试着用Cows and Bulls game word版本做一个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();
}但是我遇到的问题是,假设我把单词"clay“放在要猜测的地方,但是一旦编译器接受了猜测单词的值,前面给出的单词"clay”就变成了"/000lay“,这就完全搞砸了程序。我可以在调试时看到这一点。
Here's the image
为什么会发生这种情况?如有任何帮助,我们不胜感激!
发布于 2016-04-05 17:35:31
您不会为最后的NUL终止符('\0')预留空间,当输入大于或等于4个字符时,最终会通过scanf调用未定义的行为。变化
char word[4],guess[4];至
char word[5], guess[5];其他建议和评论:
system需要stdlib.h。包括it.conio.h (和getch) non-standard.void main()不是main的标准签名。请改用int main(void)。您还需要在main的末尾添加return 0; (这在scanf("%s",word);的C99+)if(1 != scanf("%4s",word)) /*检查scanf是否成功;4防止缓冲区溢出*/ {fput(“扫描word失败;正在退出...”,标准错误)退出(-1);}
同样,对于guess.
scanf,最好初始化所有变量。https://stackoverflow.com/questions/36422193
复制相似问题