【问题标题】:Getting an Array from user? C programming从用户那里得到一个数组? C 编程
【发布时间】:2016-02-01 07:49:40
【问题描述】:

输入几个数字后,我的控制台不断崩溃。我试图通过控制台从用户那里获取一个包含 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: %d\n", pos, neg, even, odd);
    return 0;
}

【问题讨论】:

  • 你没有收到任何关于你如何使用scanf的警告吗?
  • 另外,您的负数不计入偶数或奇数。将您的模一 if 移出。并且 0 将按照上面的逻辑算作奇数(请记住,0 既不是正数也不是负数,它需要自己的情况)。

标签: c arrays input scanf


【解决方案1】:

在您的代码中,

 scanf(" %d", nums[i]);

应该是

scanf(" %d", &(nums[i]));

或者,

scanf(" %d", nums+i);

因为您需要将指向变量的指针作为格式说明符的参数传递给scanf()

详细地说,%d 需要一个指向 int 的指针,而您提供的是一个 int 变量。它调用undefined behavior

也就是说,

  1. 始终检查scanf() 的返回值以确保正确扫描。
  2. int main() 应为 int main(void) 以符合标准。

【讨论】:

  • ... 或者直接通过num + i。这至少是更少的打字。
  • scanf(" %d", &amp;(nums[i])); 中不需要额外的括号 - 它可以是 scanf(" %d", &amp;nums[i]);
  • @Paul R 好奇你提到不需要(),但在" %d" 中没有提到不需要" "。 --> scanf("%d", &amp;nums[i]);
  • @chux: 是的,在这种情况下可能不需要,但通常可用于清除先前读取的尾随换行符或其他空白。
  • @Paul R scanf("%d", &amp;nums[i]); 刷新“来自先前读取的尾随换行符或其他空白”,即使格式中没有前导" "
【解决方案2】:

scanf(" %d", &amp;nums[i]);一样修改scanf

【讨论】:

    【解决方案3】:
    scanf(" %d", nums[i]);
    

    Scanf 需要一个指向要写入的位置的指针,而您没有给它。

    将您的 scanf 更改为:

    scanf(" %d", &(nums[i]));
    

    使您的程序正常运行。

    通过此更改,我使用stdin of 测试了您的程序

    20 10 9 1 39 1 2 2 31 1

    并收到输出:

    给我 10 个数字:正数:10,负数:0,偶数:4,赔率:6

    ideone 用于您的测试目的。

    【讨论】:

    • scanf(" %d", &amp;(nums[i])); 中不需要额外的括号 - 它可以是 scanf(" %d", &amp;nums[i]);
    • @PaulR 是的。无论如何,我通常喜欢放置它们,但没有它也可以。
    【解决方案4】:

    scanf(" %d", nums[i]); 更改为scanf(" %d", &amp;nums[i]);,因为scanf() 需要地址。 nums[i] 周围的括号不是必需的,可能会影响可读性。

    还要注意0 是偶数,但不是负数。

    【讨论】:

      【解决方案5】:

      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 positive\n", pos);
          printf("    %d negative\n", neg);
          printf("    %d even\n", even);
          printf("    %d odd\n", odd);
      
          return 0;
      }
      

      【讨论】:

        【解决方案6】:

        将for循环后的scanf语句改为

        scanf(" %d", &nums[i]);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-06
          • 2021-09-17
          • 2013-04-27
          相关资源
          最近更新 更多