如何让scanf拒绝新行

如何让scanf拒绝新行,c,stdin,C,Stdin,所以我只是在做一个基本的游戏,输入一个介于1和10之间的数字。经过一番周旋,我终于设法使一切正常进行了。 最后一个难题是,如果你在没有任何其他输入的情况下按enter键,它只会生成一个新行,而不是像我希望的那样重新提示 目前我的代码基本上是这样的: int guess = 0; ungetc('\n', stdin); do { while((guess = getchar()) != '\n' && guess != EOF); printf("Please

所以我只是在做一个基本的游戏,输入一个介于1和10之间的数字。经过一番周旋,我终于设法使一切正常进行了。 最后一个难题是,如果你在没有任何其他输入的情况下按enter键,它只会生成一个新行,而不是像我希望的那样重新提示

目前我的代码基本上是这样的:

int guess = 0;

ungetc('\n', stdin);

do
{
    while((guess = getchar()) != '\n' && guess != EOF);
    printf("Please type a integer value between and inclusive of 1 and 10: \n");

}while(scanf("%d", &guess) != 1 || guess < 0 || guess > 10);
int guess=0;
ungetc('\n',stdin);
做
{
而((guess=getchar())!='\n'&&guess!=EOF);
printf(“请键入介于1和10之间的整数值:\n”);
}而(scanf(“%d”,&guess)!=1 | | guess<0 | | guess>10);

我所希望的是,如果你按enter键,它会再次循环,而其他什么都没有,但我无法解决这个问题。

如果你不想
scanf
简单地阻止等待有效输入,那么你可以使用
scanf
进行整数输入,这对你自己来说真的很难<代码>FGET和
sscanf
要容易得多

但是,您可以使用
scanf
(以及
getchar
ungect
)来执行此操作,并且在整个过程中进行操作是有指导意义的

首先,一般方法(如您所采取的)是不断循环,直到您收到有效输入,或者用户通过生成手动
EOF
(例如,使用Ctrl+D或windoze上的Ctrl+Z)取消输入

要防止
scanf
阻塞,您需要预先读取
stdin
中的内容,以便在无需任何额外输入的情况下捕获按Enter键的用户。简单的方法是简单地
getchar()
并测试字符是否为
'\n'
,或
EOF
,或者是否有一个字符用于输入,然后使用
ungetc
将其放回
stdin
并继续
scanf
转换为
int
(此时,您可以让
scanf
处理匹配或输入故障

总而言之,您可以执行以下操作:

#include <stdio.h>

int main (void) {

    int guess;

    for (;;) {  /* loop until valid input or user cancels */

        int c, rtn;     /* char for getchar(), return for scanf */

        printf ("enter an integer [1-10 inclusive]: "); /* prompt */

        if ((c = getchar()) == '\n')    /* did the user press [Enter]? */
            continue;                   /* redisplay prompt */
        else if (c == EOF) {            /* did user cancel input? */
            fprintf (stderr, "user canceled input.\n"); /* bail */
            return 0;
        }
        else {  /* otherwise validate putting char back in stdin */
            if (ungetc (c, stdin) != c) {
                fprintf (stderr, "error: ungetc failed.\n");
                return 1;
            }
        }
        rtn = scanf ("%d", &guess);      /* save scanf return */

        /* validate return and input range */
        if (rtn != 1 || guess < 1 || 10 < guess) {
            fprintf (stderr, "error: invalid input.\n");
            for (c = getchar(); c != '\n' && c != EOF; c = getchar()) {}
        }
        else
            break;  /* we have a good value */
    }

    printf ("good guess: %d\n", guess);

    return 0;
}
或者,用户使用Ctrl+D生成一个
EOF

仔细检查,如果有问题请告诉我——然后用
fgets
sscanf
重新实现逻辑(更简单)。例如,您可以用以下代码替换上面的代码:

#include <stdio.h>

#define MAXC 256

int main (void) {

    int guess;

    for (;;) {  /* loop until valid input or user cancels */

        char buf[MAXC] = "";    /* buffer for fgets */

        printf ("enter an integer [1-10 inclusive]: "); /* prompt */

        if (fgets (buf, MAXC, stdin) == NULL) {
            fprintf (stderr, "user canceled input.\n"); /* bail */
            return 0;        
        }

        /* perfom conversion to int and validate range */
        if (sscanf (buf, "%d", &guess) != 1 || guess < 1 || guess > 10)
            fprintf (stderr, "error: invalid input.\n");
        else    /* we have a good value */
            break;
    }

    printf ("good guess: %d\n", guess);

    return 0;
}
#包括
#定义MAXC 256
内部主(空){
智力猜测;
for(;;){/*循环,直到有效输入或用户取消为止*/
char buf[MAXC]=“”;/*FGET缓冲区*/
printf(“输入整数[1-10]:”;/*提示符*/
如果(fgets(buf、MAXC、stdin)=NULL){
fprintf(stderr,“用户已取消输入。\n”);/*bail*/
返回0;
}
/*执行到int和validate range的转换*/
如果(sscanf(buf,“%d”&猜测)!=1 | |猜测<1 | |猜测>10)
fprintf(stderr,“错误:无效输入。\n”);
else/*我们有很好的价值*/
打破
}
printf(“正确猜测:%d\n”,猜测);
返回0;
}

考虑使用
fgets
sscanf
而不是
scanf
,这是因为
scanf
阻塞等待输入并按
[Enter]当你在寻找整数时,
本身并不构成输入。while中的条件应该是
guess<1
而不是
guess<0
?哇,那里有这么多好的信息。是的,我很早就意识到可能有更好更简单的方法来实现这一点,但除了固执之外,我发现了它对缓冲区和stdio的工作方式非常有洞察力(这只是为了学习,而不是我需要完成的任何项目)以及如何正确地进行分支和验证输入。这是一次很好的体验,你的回答肯定帮了大忙!是的,这是最好的学习方法。找出所有被
scanf
咬到的方法,以及剩下的正确方法。
scanf
实际上只是一个字符记帐问题。知道t格式说明符忽略空白(数字转换)和不忽略空白(字符转换),然后计算有效转换后
stdin
中剩下的内容,以及失败后剩下的内容。以这种方式处理,使用它不会有问题。跳过记帐,你注定会被咬。
$ ./bin/scanfguess
enter an integer [1-10 inclusive]: user canceled input.
#include <stdio.h>

#define MAXC 256

int main (void) {

    int guess;

    for (;;) {  /* loop until valid input or user cancels */

        char buf[MAXC] = "";    /* buffer for fgets */

        printf ("enter an integer [1-10 inclusive]: "); /* prompt */

        if (fgets (buf, MAXC, stdin) == NULL) {
            fprintf (stderr, "user canceled input.\n"); /* bail */
            return 0;        
        }

        /* perfom conversion to int and validate range */
        if (sscanf (buf, "%d", &guess) != 1 || guess < 1 || guess > 10)
            fprintf (stderr, "error: invalid input.\n");
        else    /* we have a good value */
            break;
    }

    printf ("good guess: %d\n", guess);

    return 0;
}