c - 需要帮助理解 while 循环

标签 c

假设我们有一段非常简单的代码,其开头如下:

#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 multiply 10 by 20, then (10*20) by 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 位 int)。随心所欲地调整。

关于c - 需要帮助理解 while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18605949/

相关文章:

c - 使用 #ifndef 指令在多个 C 代码中重新定义符号

c - 如何找到数组中最短运行的最后一个索引?

c - 传递双指针作为参数

c - 用于在计算机之间发送消息的 Win32 API

python - C 与 Python 中特征向量例程的不同结果

c - MinGW "stdio.h : No such file or directory"

c - 应该在 longjmp() 之后调用 free() 吗?

c - MSP430 函数调用被跳过

c++ - 无限的 typedef 函数指针继承可能吗?

c++ - 使用 libxml2 编写 Base64 编码的文本节点