【问题标题】:loop condition with variable input with scanf - C带有scanf变量输入的循环条件-C
【发布时间】:2017-10-21 09:52:08
【问题描述】:
#include <stdio.h>
#include <stdlib.h>

int main() {
    unsigned int n0;

    scanf("%d", &n0);
    const unsigned int n = n0;
    short unsigned int A[n];
    short unsigned int d, x, y, k;
    short int l, r;
    int i, j;

    for (i = 0; i < n; i++) {
        scanf("%d", &A[i]);
    }

    scanf("%d", &d);
    for (i = 1; i <= d; i++) {
        scanf("%d %d", &x, &y);
    }
    return 0;
}

您好,我是 C 的新手,偶然发现了一个让我很惊讶的情况。在上面的代码中,我想要求用户输入一些数字d,然后输入d对点坐标。但令我惊讶的是,程序在输入第一对 (x,y) 后结束执行,无论首先输入大于 1 的 d 的哪个值。如果我在代码中为d 赋值(例如d = 5;),则不会发生这种情况。可能是什么原因?通过scanf 语句分配给变量的值是否有所不同并且不能在循环条件中使用?

【问题讨论】:

  • for (i=0;i&lt;n;i++){ scanf("%d",&amp;A[i]); } 是什么意思?
  • @xing,成功了,谢谢!但为什么实际上 %d 不起作用?
  • @KrzysztofSzewczyk,这是为了进一步的功能,我忘了在这里删除它。

标签: c for-loop scanf


【解决方案1】:

注意编译代码时收到的警告。警告之一应如下所示:

a.c:19:12: warning: format specifies type 'int *' but the argument has type
     'unsigned short *' [-Wformat]
scanf("%d",&d);
      ~~  ^~
      %hd

使用%d 会导致scanf 将指向short 的指针转换为指向int 的指针,从而导致未定义的行为。在您的情况下,int 的上部似乎存储在 short 中,而底部则被丢弃。对于数字 undef 216,上半部分为零,因此后续循环迭代为零次。

修复所有警告将消除此问题

scanf("%hu", &d);
... // Fix other scanf calls as well.

注意:没有充分的理由制作循环变量short。

【讨论】:

  • 感谢您的详尽解释!
猜你喜欢
  • 2021-07-25
  • 2020-04-16
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多