2017-10-21 54 views
2
#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什么值。如果我在代码(e.x. d = 5;)中为d赋值,则不会发生这种情况。可能是什么原因?通过scanf声明分配给变量的值是否有所不同,并且不能用于循环条件?环境条件与可变输入与scanf - C

+0

这是什么'为(i = 0; I

+0

@xing,它的工作,谢谢!但为什么实际%d没有按't没有工作? – jakes

+0

@KrzysztofSzewczyk,这是进一步功能的东西,我忘了在这里删除它 – jakes

回答

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 2 上部为零,所以后续循环迭代零次。

修复所有警告将消除这一问题

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

注:没有为使循环变量short没有很好的理由。

+1

感谢您的详细解释! – jakes