输入几个数字后,我的控制台不断崩溃。我试图通过控制台从用户那里获取一个由 10 个数字组成的数组,然后计算正数、负数、偶数和赔率。我做错了什么?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int pos, neg, even, odd;
int nums[10];
printf("Give me 10 numbers: ");
pos = neg = even = odd = 0;
for(int i = 0; i < 10; i++){
scanf(" %d", nums[i]);
if(nums[i] > 0){
pos++;
if(nums[i] % 2 == 0){
even++;
}
else{
odd++;
}
}
else{
neg++;
}
}
printf("Positives: %d, Negatives: %d, Evens: %d, Odds: %dn", pos, neg, even, odd);
return 0;
}
在你的代码中,
scanf(" %d", nums[i]);
应该是
scanf(" %d", &(nums[i]));
或
scanf(" %d", nums+i);
因为您需要将指向变量的指针作为格式说明符的参数传递scanf()
.
详细来说,%d
需要一个指向int
的指针,而您提供的是一个int
变量。 它调用未定义的行为。
可是
- 始终检查
scanf()
的返回值以确保正确扫描。 -
int main()
应int main(void)
以符合标准。
像scanf(" %d", &nums[i]);
一样修改扫描
scanf(" %d", nums[i]);
Scanf 需要一个指向要写入的位置的指针,而你没有给它一个指针。
将扫描更改为:
scanf(" %d", &(nums[i]));
使您的程序正常工作。
通过此更改,我用 stdin
20 10 9 1 39 1 2 2 31 1
并接收输出:
给我 10个数字:正数:10,负数:0,偶数:4,赔率:6
用于测试目的的事物之一。
将scanf(" %d", nums[i]);
更改为scanf(" %d", &nums[i]);
,因为scanf()
需要地址。nums[i]
周围的括号不是必需的,可能会影响可读性。
另请注意,0
是偶数,但不是负数。
当scanf
用于转换数字时,它需要一个指向相应类型的指针作为参数,在您的情况下int *
:
scanf(" %d", &nums[i]);
这应该可以摆脱您的崩溃。 scanf
有一个返回值,即进行的转换次数或EOF
指示输入结束的特殊值。请检查它,否则您无法确定您已读取有效的数字。
当您查看代码时,您会注意到您不需要数组。读取数字后,您不会对数组执行操作。你只需记录奇数、偶数等数字。这意味着您只需要一个整数来存储当前数字。这也很好地将您的程序扩展到任何长度的输入。
这是一个变体,它读取数字直到到达输入的末尾(通过按 Ctrl-D 或 Ctrl-Z)或直到输入非数字,例如 "stop"
:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int count = 0;
int pos = 0;
int neg = 0;
int even = 0;
int odd = 0;
int num;
while (scanf("%d", &num) == 1) {
count++;
if (num > 0) pos++;
if (num < 0) neg++;
if (num % 2 == 0) even++;
if (num % 2 != 0) odd++;
}
printf("%d numbers, of which:n", count);
printf(" %d positiven", pos);
printf(" %d negativen", neg);
printf(" %d evenn", even);
printf(" %d oddn", odd);
return 0;
}
将 for 循环之后scanf
语句更改为
scanf(" %d", &nums[i]);