gpt4 book ai didi

c - 如何让 scanf 拒绝换行

转载 作者:太空宇宙 更新时间:2023-11-04 02:27:36 25 4
gpt4 key购买 nike

所以我只是在做一个基本的输入 1 到 10 之间的数字的游戏。经过大量的困惑之后,我终于设法让一切正常进行。最后一个难题是,如果你在没有任何其他输入的情况下按回车键,它只会换行而不是像我想要的那样重新提示。

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

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

我想要的只是如果你按下回车键它会再次循环,但我无法解决这个问题。

最佳答案

如果您不希望 scanf 简单地阻止等待有效输入,那么您可以使用 scanf 进行整数输入,这确实会让事情变得困难。 fgetssscanf 要容易得多。

但是,您可以使用 scanf(以及 getcharungetc)完成此操作,并且完成整个过程很有启发性。

首先,一般方法(正如您所采用的)是不断循环,直到您收到有效输入或用户通过生成手动 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;
}

(注意:您可以自由地在 '\n' 上警告无效输入,但简单地重新显示提示是够了)

示例使用/输出

用户在输入第一个字符之前按 Enter 三下。

$ ./bin/scanfguess
enter an integer [1-10 inclusive]:
enter an integer [1-10 inclusive]:
enter an integer [1-10 inclusive]:
enter an integer [1-10 inclusive]: a
error: invalid input.
enter an integer [1-10 inclusive]: -1
error: invalid input.
enter an integer [1-10 inclusive]: 1
good guess: 1

或者用户使用 Ctrl+D 生成 EOF 的地方:

$ ./bin/scanfguess
enter an integer [1-10 inclusive]: user canceled input.

检查一下,如果您有任何问题请告诉我——然后使用 fgetssscanf 重新实现逻辑(更简单)。例如,您可以将上面的代码替换为:

#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;
}

关于c - 如何让 scanf 拒绝换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48860718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com