我想用C语言编写简单的程序,允许用户更改x和y坐标的值。 w表示y ++,s表示y--,表示x--,d表示x ++。我已经创建的代码是这样的:
#include <stdio.h>
int main()
{
int x=0,y=0;
char choice;
do
{
printf("Your position x=%i y=%i\n",x,y);
scanf("%c",&choice);
if(choice=='w'){y++;}
else if(choice=='s'){y--;}
else if(choice=='a'){x--;}
else if(choice=='d'){x++;}
else if(choice=='q'){printf("Quit\n");}
else {printf("Wrong\n");}
}while(choice!='q');
return 0;
}
不幸的是,如果我执行程序,例如调用'w',我会得到输出:
Your position x=0 y=0
w
Your position x=0 y=1
Wrong
Your position x=0 y=1
为什么程序会像这样工作?
答案 0 :(得分:0)
#include <stdio.h>
int main()
{
int x=0,y=0;
char choice;
while(scanf("%c",&choice)&& choice!='q')
{
if(choice=='w')
{
y++;
printf("Your position x=%i y=%i\n",x,y);
}
else if(choice=='s')
{
y--;
printf("Your position x=%i y=%i\n",x,y);
}
else if(choice=='a')
{
x--;
printf("Your position x=%i y=%i\n",x,y);
}
else if(choice=='d')
{
x++;
printf("Your position x=%i y=%i\n",x,y);
}
else if(choice=='q')
{
printf("Quit\n");
printf("Your position x=%i y=%i\n",x,y);
}
else
{
printf("Wrong\n");
printf("Your position x=%i y=%i\n",x,y);
}
scanf("%c",&choice);
}
return 0;
}
答案 1 :(得分:0)
正如上面的Keine Lust所建议的那样,为了以这种方式使用scanf()
的输出,您必须在%c
转换前添加空格以消除换行符。
根据您的选择,您也可以使用switch case
代替所有if
语句。使用gcc
编译任一个会产生完全相同的代码大小,但有些人会认为switch case
稍微更具可读性。考虑到以上所有因素,我们将得出以下源代码:
#include <stdio.h>
int main()
{
int x=0,y=0;
char choice;
do
{
printf("Your position x=%i y=%i\n",x,y);
scanf(" %c",&choice);
switch (choice) {
case 'w':
y++;
break;
case 's':
y--;
break;
case 'a':
x--;
break;
case 'd':
x++;
break;
case 'q':
printf("Quit\n");
break;
default:
printf("Wrong\n");
}
}while(choice!='q');
return 0;
}
答案 2 :(得分:0)
这句话:
scanf("%c",&choice);
输入stdin
中的下一个字符。
最有可能的是,这个字符将是“空格”,就像换行符一样。
建议的修复方法是修改格式字符串以包含前导空格。类似于:
scanf(" %c",&choice);
领先的空间将消耗任何领先的“空白区域”。