#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来停止。将这些输入与奇数分开。告诉他们他们放了多少偶数/奇数以及所有偶数/奇数的总数。
我理解如何将赔率与赔率分开。我认为我的问题在于我的功能。
答案 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_count
和even_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!)