假设我们有一段非常简单的代码,其开头如下:
#include <stdio.h>
int main() {
char c;
int x;
printf("Num here: ");
c = getchar();
x = 0;
while (c!=EOF) {
x = c - 48; //to convert x from ASCII
在这个程序中,我试图让用户输入一个数字(例如 42),然后尝试将个位数加到十位(以及百位等);我很难理解如何让 while 循环返回循环直到数字结束。
所以,我需要很多帮助来理解如何让循环读取直到字符结束,读取用户输入的字符作为数字 (42),然后分别使用只是获取字符()。
最佳答案
通常,您会使用:
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'
然后你读取换行符 '\n'
。对于从 '0'
到 '9'
的每个数字,digit - '0'
生成与该数字对应的数字。换行符不能是数字的一部分,因此您可以使用 ungetc(c, stdin)
将其放回原处,或者在阅读后打破循环。
如果用户键入 43219876543 而您预期仅为 42(并且 int
是 32 位数量),请注意溢出。
你可以把循环条件写成:
while ((c = getchar()) != EOF && isdigit(c))
甚至:
while (isdigit(c = getchar()))
我非常不愿意将后者实际放入生产代码中,但从理论上讲,它是安全的。
How could I treat each number individually so that I can use the entirety of the numbers later on? So that if the user types
10 20 30
, I can multiply10
by20
, then (10*20
) by30
?
轮子中的轮子——或循环中的循环。您需要稍微指定您的标准。如果用户键入 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 位 int
)。随心所欲地调整。
关于c - 需要帮助理解 while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18605949/