需要帮助理解while循环

时间:2013-09-04 05:23:01

标签: 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),然后使用单独处理数字只是getchar()。

4 个答案:

答案 0 :(得分:8)

通常情况下,你会使用:

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',然后阅读换行符{{1} }。对于从'\n''0'的每个数字,'9'都会产生与该数字对应的数字。换行符不能作为数字的一部分,因此您要么使用digit - '0'将其换回,要么在阅读时断开循环。

如果用户键入43219876543,您只需要42(而ungetc(c, stdin)是32位数量),请注意溢出。

您可以将循环条件写为:

int

甚至:

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

我也试过一个版本略有不同的'skip'循环:

#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;第一个,你得到一个无限循环。没有溢出保护;不要尝试使用factorial 20并期望正确答案(使用32位0)。调整你心中的内容。

答案 1 :(得分:1)

您的代码:

#include <stdio.h> 
#include<ctype.h>
int main() {
    int c;//getchar() returns integer
    int x;

    printf("Num here: ");

    x=0;    
    //As @Jonathan Leffler  suggested ,  
    //usage of while loop like this is very helpful the moment you press Enter loop breaks.  

    while (isdigit(c = getchar())) //isdigit is a function from ctype.h checks for Entered character is digit or not
        x = x*10 + c - 48; //here '0'==48   
    printf("%d",x);  
    }

当你输入42

loop rotates two times for c==4 and c==2
c==4 
x=0*10+'4'-48 //here '4'==52 ==>  x=0+52-48  ==>x=4
c==2
x=4*10+'2'-48 //here '2'==50 ==> x=40+50-48 ==>x=42  

将数字添加到数十,然后数百......如果要在输入数字中添加数字,请在循环中使用此数据

int sum=0,num;
//read num
while(num>0)
{
sum=sum+num%10; //get the last digit and add to sum
num=num/10; //reduce last digit of num
}  

答案 2 :(得分:0)

逐个字符地读入,并使用Jonathan的答案中的while循环将其转换为数字。每次读取数字时,只需将当前总和乘以10即可,并添加数字。这样,当您读取最后一个数字并将其添加时,您将拥有正确的数字。

答案 3 :(得分:0)

有时我们认为应该解决问题的方式可以在考虑所有语言功能时以不同的方法解决。

#include <stdio.h>
int main() {
    int x;

    printf("Num here: ");
    scanf("%d", x);

}

实现与程序相同的功能。