所以现在,我主修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
仔细查看,如果您有其他问题,请告诉我。