通常,您会使用:
int c; // Because getchar() returns an int, not a char
int x = 0;
while ((c = getchar()) != EOF)
{
if (isdigit(c))
x = x * 10 + (c - '0');
else
...
}
每次到达循环顶部时都会读取一个字符。您可以通过在循环末尾运行大括号(或偶尔使用continue
语句)来使循环返回。您可以使用 退出循环break
,例如,如果您读取了一些不能成为数字一部分的字符。
如果用户键入42
(后跟Enter),那么您首先阅读c == '4'
,然后c == '2'
再阅读 newline '\n'
。对于从'0'
到的每个数字'9'
,digit - '0'
产生对应于该数字的数字。换行符不能是数字的一部分,因此您可以ungetc(c, stdin)
在阅读时将其放回原处或中断循环。
如果用户键入 43219876543,而您预计只有 42 个(并且int
是 32 位数量),请注意溢出。
您可以将循环条件编写为:
while ((c = getchar()) != EOF && isdigit(c))
甚至:
while (isdigit(c = getchar()))
我非常不愿意将后者实际放入生产代码中,但理论上它是安全的。
我如何单独处理每个数字,以便以后可以使用整个数字?这样,如果用户键入10 20 30
,我可以乘以10
,20
然后 ( 10*20
) 乘以30
?
轮子中的轮子——或循环中的循环。您需要稍微指定您的标准。如果用户键入1
您想要的答案1
;如果他们打字1 2
,你想要2
;如果他们打字1 2 3
,你想要6
;依此类推(这些是单行输入中的所有数字)。您需要一个跳过空格和制表符的外循环,然后使用内循环读取一个数字,然后将当前乘积(初始值1
)乘以新数字,在外循环之后,您将打印产品。这将打印1
一个空行;也许这无关紧要(也许确实如此)。
这是一些近似于适当的代码:
#include <ctype.h>
#include <stdio.h>
int main(void)
{
int c;
while ((c = getchar()) != EOF && c != '\n')
{
int product = 1;
while (c != EOF && c != '\n')
{
while (isspace(c))
c = getchar();
int number = 0;
while (isdigit(c))
{
number = number * 10 + (c - '0');
c = getchar();
}
printf("Number: %d\n", number);
product *= number;
}
printf("Product: %d\n", product);
}
return 0;
}
我还尝试了一个稍微不同的“跳过”循环的版本:
while (c != EOF && c != '\n' && !isdigit(c))
c = getchar();
两者都可以正常输入。空行被视为输入结束;包含空格的行不是。如果你输入1a2b3c
第二个条件,你会得到输出0
;第一个,你得到一个无限循环。没有溢出保护;不要尝试做阶乘 20 并期待正确的答案(使用 32-bit int
)。随心所欲地调整。