为什么我写了一些其他字母或数字(不是你的订单)
printf("\nWould you like to play again? (y/n):");
跑了两次?
int ans= 0,i=1;
do
{
printf("\nWould you like to play again? (y/n):");
ans = getchar();
if (ans=='y')
{
printf("yyyyyyyyyyy");
i = i-1;
}
else if ( ans == 'n')
{
printf("nnnnnnnnnnn");
i=i-1;
}
else
{
printf("not y or n");
}
}
while(i);
答案 0 :(得分:2)
while(i)
实际上与while(i != 0)
相同。如果您输入的内容不是y
或n
,则else
块会运行,并且不会更改i
的值。由于在循环之前i=1
,i
如果您输入的内容不是y
或n
,则非{0}。尝试:
else
{
printf("not y or n");
i = i-1; // <---- new line
}
答案 1 :(得分:2)
可能是因为您的getchar
来电正在从您的输入中获取换行符。因此,如果按'X',第一次循环ans
为'X',换行符被缓冲。第二次循环ans
是'\ n'。
您可以像这样在输入调用周围循环:
do
ans = getchar();
while (isspace(ans));
答案 2 :(得分:2)
这太复杂了。正如您在评论中所述,您只想循环,直到输入y
或no
为止。不需要额外的变量。一般来说,对于这些问题,使用计数器是个坏主意。更多故障安全是使用bool
标志。
没有辅助变量的好方法是:
int ans; // no need to initialise, as it is set before the first read
do {
printf("Play again?");
do {
ans = getchar();
} while ( ans == `\n` );
...
} while ( (ans != EOF) && !strchr("yYnN", ans) );
见strchr
。我添加了对大写字母的容忍度。
请注意,您也始终检查EOF。由于无法将其表示为char
,因此您必须单独测试并首先(否则strchr
中的转换可能会产生意外结果。
另请注意fflush
输入流(可在互联网上的某些代码中找到)是未定义的行为 - 不要使用它。即使某些库容忍它,它们也可能不会按预期运行(未定义的行为暗示)。一般表示为&#34;写/发出&#34;的语义。数据。输入通常是&#34;掉线&#34; (并且没有fdrop
功能。
修改:添加内部循环以删除换行符。如果没有这个,循环将在输入无效字符后运行两次。假设您必须每行输入一个字符。
答案 3 :(得分:0)
无论您在按 Enter 之前输入的是什么字母,该行
c = getchar();
仍然在输入流中留下换行符。
如果该字符不是y
和n
,则该调用将在不等待您的情况下执行,并且换行符将分配给c
。因此,您会看到以下两行的输出。
printf("\nWould you like to play again? (y/n):");
和
printf("not y or n");
您需要在
之后添加代码以忽略输入中的其余部分c = getchar();
添加功能:
void ignoreRestOfLine()
{
int c;
while ( (c = getchar()) != EOF && c != '\n');
}
并将其命名为:
c = getchar();
ignoreRestOfLine();
答案 4 :(得分:0)
问题是当你在do中再次进入程序时,内存中已经有了答案。 getchar()
添加了\ n,这就是剩下的内容。为了避免这种情况,你可以使ans成为一个字符(char),这意味着它将读取ascii表; (y = 121和n = 110)。 Char在收到输入后没有放置\ n(新行),为了确保发生这种情况,你必须在%c之前留一个空格,因此scanf(" %c", &ans);
这意味着ans正在接收一个int。
#include<stdio.h>
#include<stdlib.h>
int main(void){
char ans;
int i = 1;
do
{
printf("\nWould you like to play again? (y/n):");
scanf(" %c", &ans);
if (ans == 121){
printf("yyyyyyyyyyy");
i = i - 1;
}
else if ( ans == 110){
printf("nnnnnnnnnnn");
i = i - 1;
}
else{
printf("not y or n");
}
}
while(i);
}
答案 5 :(得分:0)
另一种解决方案:
char c = 'x'; // Initialize to a character other than input
while( c != 'y' || c != 'n') { // You can also use strchr as @Olaf mentioned
printf ("\nPlay again (y/n): ");
c = getchar ();
}