Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在一个变量中存储多个整数,以便以后可以得到它们的总数_C_Arrays_Loops - Fatal编程技术网

C 如何在一个变量中存储多个整数,以便以后可以得到它们的总数

C 如何在一个变量中存储多个整数,以便以后可以得到它们的总数,c,arrays,loops,C,Arrays,Loops,我想把输入的数字存储在某个地方,以便我以后可以查看它们的总数,有人能帮忙吗 #include<stdio.h> #include<conio.h> main() { int range; int num; int i; int total = 0; printf("how many numbers will you put?\n"); scanf("%d", &range); for(i=0;i<

我想把输入的数字存储在某个地方,以便我以后可以查看它们的总数,有人能帮忙吗

#include<stdio.h>
#include<conio.h>

main() {
    int range;
    int num;
    int i;
    int total = 0;

    printf("how many numbers will you put?\n");
    scanf("%d", &range);

    for(i=0;i<range;i++) {
        printf("please enter the number\n");
        scanf("%d", &num); 
    }
    printf("%d", total);

    return 0;
}

你的尝试很接近。正如David C.Rankin提到的,您真正做错的只是没有检查scanf的返回值


除了您收到的其他建议外,您还必须处理删除导致scanf失败的任何字符。为什么?当scanf出现匹配或输入失败时,所有从stdin读取的数据都将停止,不再读取更多字符,导致问题的字符将在下次调用scanf时再次咬伤您

要解决此问题,您需要负责对剩余的任何字符进行核算,您只能通过检查scanf的返回来确定这些字符。如果出现匹配或输入失败,则可以使用简单的帮助功能读取并丢弃所有字符,直到下一个“\n”或EOF(以先发生的为准),例如

void empty_stdin (void)
{
    int c = getchar();

    while (c != '\n' && c != EOF)
        c = getchar();
}
然后,只要在您遇到匹配或输入失败时,以及将控制传递到另一个将接收输入的区域时,将其合并到您的代码中,就可以确保输入缓冲区是干净的

将这些部分放在一起,您可以执行以下类似操作:

#include <stdio.h>
// #include <conio.h>  /* don't use conio.h -- it is DOS only */

void empty_stdin (void)
{
    int c = getchar();

    while (c != '\n' && c != EOF)
        c = getchar();
}

int main (void) {
    int range,
        num,
        i,
        total = 0;

    printf ("how many numbers will you enter: ");
    if (scanf ("%d", &range) != 1) {
        fputs ("error: invalid input - range.\n", stderr);
        return 1;
    }

    for (i = 0; i < range; i++) {
        for (;;) {  /* loop continually until you get the input you need */
            int rtn;
            printf ("\n  enter number[%2d]: ", i + 1);
            rtn = scanf("%d", &num);
            if (rtn == EOF) {   /* handle user EOF */
                fputs ("user canceled input.\n", stderr);
                return 1;
            }
            else if (rtn == 0) {    /* handle matching or input failure */
                fprintf (stderr, "error: invalid input, number[%d]\n", i + 1);
                empty_stdin ();
            }
            else        /* good conversion, break read loop */
                break;
        }
        total += num;   /* add num to total */
    }
    printf ("\nTotal: %d\n", total);

    return 0;
}

仔细检查一下,如果你还有其他问题,请告诉我。避免我在对你的问题的评论中提到的命运…

其他评论者是正确的,在一般情况下,你应该在阅读数字时计算总和。遵循其他答案建议,如清除标准输入,并可能为用户提供一种在出现错误时重试输入的方法

但也要注意未定义的行为。例如,使用有符号整数计算和可能会导致接近INT_MAX和INT_MIN的未定义行为。在进行和之前,您可能应该检查这些边界的距离是否小于当前添加的数字 顺便说一下,请参见

或者,您可以将数字放入一个数组中,并从整数加法可以在可能的情况下交换以取消溢出这一事实中获益。这里有一种可能的测试方法,但可能仍然存在错误:

#include <stdio.h>
#include <limits.h>

/* arbitrary limit */
#define MAX_RANGE 32

/* numbers being read */
int numbers[MAX_RANGE];

/* non-zero if number was already added in sum */
int added[MAX_RANGE];

int main()
{
    int scan;
    int range;
    int num;
    int i;
    int sum;
    int overflow;
    int changed;

    printf("INT_MAX is %d\n", INT_MAX);
    printf("How many numbers will you put? (0-%d): ", MAX_RANGE-1);
    fflush(stdout);
    scan = scanf("%d", &range);
    if (scan != 1) {
        perror("Cannot read range: ");
        return -1;
    }

    if (!(0 <= range && range <= MAX_RANGE)) {
        fprintf(stderr, "Out of range");
        return -1;
    }

    for(i = 0; i < range; i++) {
        printf("Please enter a number\n");
        scan = scanf("%d", &num);
        if (scan != 1) {
            perror("Error when reading number: ");
            return -1;
        }
        numbers[i] = num;
        added[i] = 0;
    }

    sum = 0;
    do {
        changed = 0;
        overflow = 0;
        printf("loop: %d\n", sum);
        for (i = 0; i < range; i++) {
            if (added[i]) { 
                continue;
            }
            num = numbers[i];
            if (sum > 0) {
                if (num > (INT_MAX - sum)){
                    overflow = 1;
                    continue;
                }
            } else {
                if (num < (INT_MIN - sum)) {
                    overflow = 1;
                    continue;
                }
            }
            printf("adding %d\n", num);
            added[i] = 1;
            changed = 1;
            sum += num;
        }
    } while (overflow && changed);

    if (overflow) {
        fprintf(stderr, "Overflow\n");
        return -2;
    }

    printf("Total: %d\n", sum);
    return 0;
}

您只需要计算总权限,为什么不在输入期间进行计算呢?您可以在处理输入时尝试计算总权限。注意:除了新的C用户无法检查传统上在日出时拍摄的scanf的返回外,您还将受益于同时避免未定义的行为。。。例如,如果scanf%d,&num==1总计+=num;,那么,当你离开循环时,你已经有了total:你还应该在那里添加一个else条件来处理任何错误,比如键入一个散乱的字符,并删除stdin中未读的无关字符,以防止你的代码像土拨鼠日那样工作……你可以使用,但是正如zenwraight和Zendy刚才说的,你最好在飞行中计算你的总和,只要加上:fori=0;我可以只扫描%*[^\n];作为一种更简单的空字符串形式,可以,但必须有足够大的缓冲区来容纳输入缓冲区中所有可能不需要的字符。如果一只猫踩在键盘上,那可能是几千。使用getchar可以消除所有缓冲区约束。但当然,它可以工作。转换说明符中的*会抑制赋值,因此不需要缓冲区。是的,我编译并运行了!呃,来晚了,眼睛疲劳。通过赋值抑制操作符,它可以工作,但接下来您将看到调用可变输入函数和简单调用字符函数之间的效率差异,这最终是scanf在幕后所做的。Linux上的IO缓冲区一次将8192个字符加载到输入缓冲区中,使用getchar只需在内存中的字符上进行迭代,因此lightning quick Windows提供了一个500个字符的缓冲区,您可以通过输出BUFSIZ常量进行检查。
$ ./bin/scanftotal
how many numbers will you enter: 4

  enter number[ 1]: 10

  enter number[ 2]: 20

  enter number[ 3]: foo
error: invalid input, number[3]

  enter number[ 3]: 30

  enter number[ 4]: 40

Total: 100
#include <stdio.h>
#include <limits.h>

/* arbitrary limit */
#define MAX_RANGE 32

/* numbers being read */
int numbers[MAX_RANGE];

/* non-zero if number was already added in sum */
int added[MAX_RANGE];

int main()
{
    int scan;
    int range;
    int num;
    int i;
    int sum;
    int overflow;
    int changed;

    printf("INT_MAX is %d\n", INT_MAX);
    printf("How many numbers will you put? (0-%d): ", MAX_RANGE-1);
    fflush(stdout);
    scan = scanf("%d", &range);
    if (scan != 1) {
        perror("Cannot read range: ");
        return -1;
    }

    if (!(0 <= range && range <= MAX_RANGE)) {
        fprintf(stderr, "Out of range");
        return -1;
    }

    for(i = 0; i < range; i++) {
        printf("Please enter a number\n");
        scan = scanf("%d", &num);
        if (scan != 1) {
            perror("Error when reading number: ");
            return -1;
        }
        numbers[i] = num;
        added[i] = 0;
    }

    sum = 0;
    do {
        changed = 0;
        overflow = 0;
        printf("loop: %d\n", sum);
        for (i = 0; i < range; i++) {
            if (added[i]) { 
                continue;
            }
            num = numbers[i];
            if (sum > 0) {
                if (num > (INT_MAX - sum)){
                    overflow = 1;
                    continue;
                }
            } else {
                if (num < (INT_MIN - sum)) {
                    overflow = 1;
                    continue;
                }
            }
            printf("adding %d\n", num);
            added[i] = 1;
            changed = 1;
            sum += num;
        }
    } while (overflow && changed);

    if (overflow) {
        fprintf(stderr, "Overflow\n");
        return -2;
    }

    printf("Total: %d\n", sum);
    return 0;
}
INT_MAX is 2147483647
How many numbers will you put? (0-31): 5
Please enter a number
2147483647
Please enter a number
2147483647
Please enter a number
-2147483647
Please enter a number
-2147483647
Please enter a number
0
loop: 0
adding 2147483647
adding -2147483647
adding -2147483647
adding 0
loop: -2147483647
adding 2147483647
Total: 0