这个功能运行的次数太多了

时间:2015-12-28 17:42:05

标签: c

为什么我写了一些其他字母或数字(不是你的订单)

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);

6 个答案:

答案 0 :(得分:2)

while(i)实际上与while(i != 0)相同。如果您输入的内容不是yn,则else块会运行,并且不会更改i的值。由于在循环之前i=1i如果您输入的内容不是yn,则非{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)

这太复杂了。正如您在评论中所述,您只想循环,直到输入yno为止。不需要额外的变量。一般来说,对于这些问题,使用计数器是个坏主意。更多故障安全是使用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();

仍然在输入流中留下换行符。

如果该字符不是yn,则该调用将在不等待您的情况下执行,并且换行符将分配给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 ();
}