2

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

#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

4 回答 4

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'再阅读 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,我可以乘以1020然后 ( 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)。随心所欲地调整。

于 2013-09-04T05:28:43.173 回答
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  

将一位数添加到数十位,然后添加数百位...如果您想在输入数字中添加数字,请在下面的 while 循环中使用

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
}  
于 2013-09-04T05:27:17.643 回答
0

逐个字符读取并使用 Jonathan 答案中的 while 循环将其转换为数字。每次你读到一个数字时,只需将你当前的总和乘以 10,然后加上这个数字。这样,当您读取最后一个数字并将其添加时,您将获得正确的数字。

于 2013-09-04T05:31:51.063 回答
0

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

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

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

}

实现与您的程序相同的功能。

于 2013-09-04T05:46:17.460 回答