从用户那里获取数组?C 编程



输入几个数字后,我的控制台不断崩溃。我试图通过控制台从用户那里获取一个由 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变量。 它调用未定义的行为。

可是

  1. 始终检查 scanf() 的返回值以确保正确扫描。
  2. 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]);

最新更新