c语言 - 使用 while 循环跟踪最大输入值



所以现在,我主修CS,我们一直在学习C。我在练习方面做得很好,除了 while 循环的这个问题。

该问题要求我们读取用户的输入,直到他们输入整数 -1。如果这是他们的第一个输入,那么程序应该打印"NO INPUT"。否则,它将打印具有最大值的整数。

我似乎无法解决这个问题,虽然它看起来很简单,但我花了几个小时在互联网上搜索答案,但我无法完成代码。这是我到目前为止得到的:

int main(int argc, char** argv)
{
//Problem 1
int input, max;
max = 0;

do
{
scanf("%d", &input);
if (input != -1)
{
if (input >= max)
{
max = input;
}
}
else
{
printf("%dn", max);
break;
}
} while (1);

return (EXIT_SUCCESS);
}

我尝试将"NO INPUT"行放在正文的第一位,但即使我输入了其他数字,它也会打印出来,我还需要让程序输出负数。例如,如果我多次输入 -10000,直到我输入 -1 结束循环,那么它应该说 -10000,但代码将输出 0。

为了打印"NO INPUT",你可以有一个变量来跟踪是否输入了输入。我建议创建一个变量(类似于has_input)并在输入do之前将其值设置为0。而循环。当您收到 -1 以外的输入时,请将其设置为 1。然后,当您退出程序时,检查has_input是否等于 0。如果是,这意味着您从未收到过 -1 以外的输入,因此您应该打印"NO INPUT",如果不是,请打印max的值。

至于为什么即使你给它输入负数它也会输出 0,想想当你输入 -10000 时会发生什么:它将该值与当前值进行比较max,默认情况下设置为 0。-10,000 和 0 的最大值为 0,因此max永远不会低于其默认值。要解决此问题,您可以将其初始化为尽可能低的 int 值,通常为 -2,147,483,648。

或者,您可以在输入 do 之前要求用户输入一次。while 循环并使用该值初始化max,如果输入为 -1,则以"NO INPUT"退出,从而解决这两个问题。

首先,您必须验证使用的每个输入函数的返回 - 每次。否则,您将邀请未定义的行为使用变量,而不知道输入是成功还是失败。始终检查退货(尤其是在使用scanf()时)

此外,在尝试循环中的下一个输入之前,您必须处理匹配失败(用户滑动并按下'r'而不是4)并从stdin中清除所有字符。如果你不这样做,你将陷入无限循环。尝试在代码中输入'r',看看会发生什么?

在您的情况下,您需要知道您是否是第一次通过循环旅行。只需声明另一个int用作标志,以指示您是否在第一次迭代中。您可以使用int first_loop = 1;来指示您第一次通过循环的行程,并将其设置为循环期间的0。(不用担心你把它设置为每次迭代0,这可以忽略不计)

总而言之,您的主要内容可能如下所示:

int main (void) {

int max = INT_MIN,                  /* initialize max to minimum possible value */
first_loop = 1;                 /* flag for 1st iteration, set true */ 

while (1) {                         /* loop continually */
int rtn, tmp;                   /* variable for scanf() return, temp value */

fputs ("enter value, -1 to exit: ", stdout);    /* prompt user */

if ((rtn = scanf ("%d", &tmp)) == EOF) {        /* read input saving return */
puts ("(user canceled input)");             /* manul EOF, user canceled */
return 0;
}
else if (rtn == 0) {            /* return 0, matching failure occurred */
fputs ("  error: invalid integer input.n", stderr);
empty_stdin();              /* empty offending characters from stdin */
continue;                   /* get next input */
}

if (tmp == -1) {                /* if input was -1 */
if (first_loop) {           /* if first_loop set, 1st iteration */ 
puts ("NO INPUT");      /* output NO INPUT and exit */
return 0;
}
break;                      /* otherwise, break read-loop */
}

if (tmp > max)                  /* set max as necessary */
max = tmp;

first_loop = 0;                 /* set first loop flag false */
}

printf ("nmax: %dn", max);        /* output result */
}

注意:将max设置为int范围内可能的最小值,INT_MIN。每当您测试最大值(以及相反的最小值)时,这是必需的。如果所有用户输入的都是较大的负值怎么办?输入中将有一个最大值,但您永远不会看到它max初始化为0;

另请注意用于删除与scanf()发生匹配失败后保留在stdin中的字符的empty_stdin()函数。您只需循环,直到找到用户按Enter生成的'n',或者您到达EOF以进行stdin。它只能是:

/* simple function to empty stdin */
void empty_stdin (void)
{
int c = getchar();

while (c != 'n' && c != EOF)
c = getchar();
}

最后请注意,您需要包含limits.h用于INT_MIN,因此,完整的程序可能是:

#include <stdio.h>
#include <limits.h>
/* simple function to empty stdin */
void empty_stdin (void)
{
int c = getchar();

while (c != 'n' && c != EOF)
c = getchar();
}
int main (void) {

int max = INT_MIN,                  /* initialize max to minimum possible value */
first_loop = 1;                 /* flag for 1st iteration, set true */ 

while (1) {                         /* loop continually */
int rtn, tmp;                   /* variable for scanf() return, temp value */

fputs ("enter value, -1 to exit: ", stdout);    /* prompt user */

if ((rtn = scanf ("%d", &tmp)) == EOF) {        /* read input saving return */
puts ("(user canceled input)");             /* manul EOF, user canceled */
return 0;
}
else if (rtn == 0) {            /* return 0, matching failure occurred */
fputs ("  error: invalid integer input.n", stderr);
empty_stdin();              /* empty offending characters from stdin */
continue;                   /* get next input */
}

if (tmp == -1) {                /* if input was -1 */
if (first_loop) {           /* if first_loop set, 1st iteration */ 
puts ("NO INPUT");      /* output NO INPUT and exit */
return 0;
}
break;                      /* otherwise, break read-loop */
}

if (tmp > max)                  /* set max as necessary */
max = tmp;

first_loop = 0;                 /* set first loop flag false */
}

printf ("nmax: %dn", max);        /* output result */
}

示例使用/输出

无输入案例:

$ ./bin/no_input
enter value, -1 to exit: -1
NO INPUT

正常情况下,故意输入无效:

$ ./bin/no_input
enter value, -1 to exit: 1
enter value, -1 to exit: 9
enter value, -1 to exit: 4
enter value, -1 to exit: bananas
error: invalid integer input.
enter value, -1 to exit: 5
enter value, -1 to exit: 11
enter value, -1 to exit: -1
max: 11

仔细查看,如果您有其他问题,请告诉我。

相关内容

  • 没有找到相关文章

最新更新