我不确定为什么我的程序在尝试关闭时会一直提示错误?

时间:2017-02-18 21:37:17

标签: c

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

int add_even(int);
int add_odd(int);

int main() {
    int num, result_odd, result_even, even_count, odd_count;
    char name;

    printf("What is your name?\n");
    scanf("%s", &name);

    while (num != 0) {
        printf("Enter a number:\n");
        scanf("%d", &num);

        if (num % 2 == 1) {
            printf ("odd\n");
            odd_count++;
        } else
        if (num == 0) {
            printf("%s, the numbers you have entered are broken down as follows:\n",
                  name);
            result_even = add_even(num);
            printf("You entered %d even numbers with a total value of %d\n",
                   even_count, result_even);
            result_odd = add_odd(num);
            printf("You entered %d odd numbers with a total value of %d\n",
                   odd_count, result_odd);
        } else {
            printf("even\n");
            even_count++;
        }
    }
    return 0;
} 

int add_even(int num) {
    static int sum = 0;

    if (num % 2 != 0) {
        return 0;
    }

    sum += add_even(num);
    return sum;
}

int add_odd(int num) {
    static int sum = 0;

    if (num % 2 == 0) {
        return 0;
    }
    sum += add_odd(num);
    return sum;
}

任何人都能给我一些关于我做错了什么的见解吗?

代码的要点是从用户那里获得输入,直到他们决定通过输入0来停止。将这些输入与奇数分开。告诉他们他们放了多少偶数/奇数以及所有偶数/奇数的总数。

我理解如何将赔率与赔率分开。我认为我的问题在于我的功能。

2 个答案:

答案 0 :(得分:2)

您的代码中存在多个问题:

  • scanf()在尝试将字符串存储到单个字符时导致未定义的行为。传递数组并指定最大长度。

  • 您应该检查scanf()的返回值:如果scanf()未能根据规范转换输入,则值未经修改,因此未初始化,并且随后会出现未定义的行为。在您的情况下,如果在提示输入2个或更多单词时,scanf("%d",...)失败,因为非数字输入处于暂挂状态,则不会从标准输入读取更多字符,并且未设置num

  • num在第一个while (num != 0)中未初始化,导致未定义的行为。

  • 函数add_even()add_odd()仅针对num == 0调用,从不对任何内容进行求和。

  • 函数add_even()add_odd()应始终返回总和,并添加参数num的值,如果它具有正确的奇偶校验。它们目前通过递归无限地调用自身来导致未定义的行为。
  • odd_counteven_count未初始化,因此计数将是不确定的并且读取它们调用未定义的行为。

尽管上面提到了所有未定义行为的来源,但是如果您为该名称键入多个单词,程序会在不期待答案的情况下保持提示的原因。只有一个单词被转换为%s,其余的作为数字的输入,在循环中反复失败。由于您未验证scanf()的返回值,因此不会注意到这些失败。

以下是更正后的版本:

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

int add_even(int);
int add_odd(int);

int main(void) {
    int num, result_odd, result_even, even_count = 0, odd_count = 0;
    char name[100];

    printf("What is your name? ");
    if (scanf("%99[^\n]", name) != 1)
        return 1;

    for (;;) {
        printf("Enter a number: ");
        if (scanf("%d", &num) != 1 || num == 0)
            break;

        if (num % 2 == 1) {
            printf("odd\n");
            odd_count++;
            add_odd(num);
        } else {
            printf("even\n");
            even_count++;
            add_even(num);
        }
        printf("%s, the numbers you have entered are broken down as follows:\n", name);
        result_even = add_even(0);
        printf("You entered %d even numbers with a total value of %d\n",
               even_count, result_even);
        result_odd = add_odd(0);
        printf("You entered %d odd numbers with a total value of %d\n",
               odd_count, result_odd);
    }
    return 0;
} 

int add_even(int num) {
    static int sum = 0;

    if (num % 2 == 0) {
        sum += num;
    }
    return sum;
}

int add_odd(int num) {
    static int sum = 0;

    if (num % 2 != 0) {
        sum += num;
    }
    return sum;
}

答案 1 :(得分:1)

你宣布:

char name;                       // One single letter, such as 'A', or 'M'

printf("What is your name?\n");  // Please enter a whole bunch of letters!
scanf("%s", &name);              // Not enough space to store the response!

你真正想要的更像是

char name[31];                   // Up to 30 letters, and an End-of-String marker

printf("What is your name?\n"); // Please enter a whole bunch of letters!
scanf("%s", name);              // name is the location to put all those letters
                                // (but not more than 30!)