scanf()迭代未知数量的整数

时间:2014-09-16 23:58:05

标签: c integer scanf

所以我试图找到未知数量的用户输入数字的总和。这是我的代码

int main()
{
    int tmp1 = 1;
    int tmp2 = 1;
    int total = 0;

    printf("Enter numbers for a sum: ");
    tmp2 = scanf(" %d", &tmp1);

    while(tmp2 > 0){
        total+=tmp1;
        tmp2 = scanf(" %d", &tmp1);
    }
    printf("total is %d", total);

    return 0;
}

它陷入无限循环,然后一旦我点击ctrl-c结束它,它就会输出正确的总和。所以我做错了是我怎么知道什么时候扫描所有整数,以及循环结束;因为我现在没有正确地做到这一点

2 个答案:

答案 0 :(得分:0)

决定让它通过ctrl d停止,并且可以接受。感谢

答案 1 :(得分:0)

在你的问题中,不清楚你希望你的程序如何理解不再有输入的数字。应该是通过一个特定的角色?或者它只是得到一行空格分隔的数字并用一个总和来回应?

从您的代码中,我最明智的猜测是:您希望它理解在遇到非数字字符时不会再添加任何数字。我的猜测是这样的,因为通过检查scanf的返回值,这几乎就是您的代码所做的。

首先,您必须将循环中的tmp更改为tmp1,因为没有声明tmp的变量。 编辑:好吧,没关系

然后尝试运行你的程序,输入任意数量的空格(空格,制表符或换行符)分隔数字,然后输入你喜欢的任何非数字字符。例如,TThoAppelsin可能无关紧要。程序不会超越第一个字符,实际上甚至超出了第一个字符。之后,您将看到数字已正确添加在一起。

由于你对一个不存在的无限循环感到困惑,我的第二个猜测是你可能实际上希望它得到一行空格分隔的数字,并打印出总和;并且将你的程序误解为“在无限循环中”,而它只是期望你的进一步输入,就像它在开始时一样。

您不会从非重定向0获得scanf("%d", &var);,除非您使用与格式字符串不匹配的内容来提供异常终止。如果输入流中没有任何东西要消耗,它只会等待更多输入。但是说你给它一个'a',那么它所能做的就是放弃并返回零,因为它不能做一个任务。

如果你真的希望有一行数字,那么我可以提供的最小变化就是这样:

int main(void)     {         int tmp1 = 1;         char tmp2 = 0;         int total = 0;

    printf("Enter numbers for a sum: ");
    scanf("%d%c", &tmp1, &tmp2);

    while(tmp2 == ' '){
        total+=tmp1;
        scanf("%d%c", &tmp1, &tmp2);
    }
    printf("total is %d", total);

    return 0;
}

当然,这种方法有很多漏洞。但是,如果用户要严格输入如下序列:

3 66 2 10 6

// mind the new-line

它会正常工作。但是,如果我允许改变超过最小值,我就会这样做:

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

int main(void)
{
    int LastNumber = 0;
    int UpcomingCharacter = 0;
    int Total = 0;

    printf("Enter numbers for a sum: ");
    while(scanf("%d%*[ \t]", &LastNumber) == 1)
    {
        Total += LastNumber;
        UpcomingCharacter = getchar( );
        if (!isdigit(UpcomingCharacter)) // eliminates a possible EOF return as well
            break;
        if (ungetch(UpcomingCharacter, stdin) != UpcomingCharacter)
        {
            fprintf(stderr, "%d: unexpected error with ungetch\n", __LINE__);
            return EXIT_FAILURE;
        }
    }
    printf("total is %d", Total);

    return EXIT_SUCCESS;
}

在任何以空格分隔的数字序列中哪个应该可以正常工作,当然不包括新行。