2016-02-05 58 views
0

我正在编写一个程序,需要我做两个数组的联合。这是我的代码到目前为止。 我得到分割故障为错误后,我进入集合Ac处理scanf中的分割错误

#include <stdio.h> 

void Union(int a[], int b[], int set1, int set2) 
{ 
    int u[20], i, j, unionIndex=0,trigger; 

for(i=0; i<set1; i++) 
{ 
    u[unionIndex] = a[i]; 
    unionIndex++; 
} 

for(i=0; i<set2; i++) 
{ 
    trigger=0; 
    for(j =0; j<set1; j++) 
    { 
     if(b[i] == u[j]) 
     {   
      trigger =1; 
      break; 
     } 
    } 
    if(trigger =0) 
    { 
     u[unionIndex]=b[i]; 
     unionIndex++; 
    } 
} 

    for(i=0;i<unionIndex;unionIndex++) 
    { 
    printf(" %d",u[i]); 
    } 
} 

    int main(void) { 
    int N=0; 
    int M=0; 
    int i; 
    int j; 

    printf("Please enter the number of elements in set A: "); 
    scanf("%d",N); 
    int a[N]; 

    printf("Enter the numbers in set: "); 
    for(i=0;i<N;i++) 
    { 
     scanf("%d",&a[i]); 
    } 

    printf("Please enter the number of elements in set B: "); 
    scanf("%d",M); 
    int b[M]; 

    printf("Enter the numbers in set: "); 
    for(j=0;i<M;i++) 
    { 
     scanf("%d",&b[i]); 
    } 

    Union(a,b,N,M); 
    return 0; 
} 

我敢肯定,这个问题有什么做的阵列,因为该程序将编译,但我得到了用户进入设置后右边的错误答:我是C初学者,但我对Java有更多的了解,所以我认为这与内存分配有关。我不太清楚如何解决这个问题,所以如果你能指出我的方向是有帮助的。

回答

1

您需要的变量的地址传递给scanf()

变化

printf("Please enter the number of elements in set A: "); 
scanf("%d",N); 

printf("Please enter the number of elements in set A: "); 
scanf("%d", &N); 

同去的其他地方

printf("Please enter the number of elements in set B: "); 
scanf("%d", &M); 

还有另一种可能的错误

它这里

for(j =0; j<set1; j++) 
{ 
    if(b[i] == u[j]) 

在这种set1等于N,所以j会从0 to N-1。并且数组u[]只有20个元素。如果某些用户输入的值超过20N),则可能会出现数组访问限制。

+1

这也适用于'M'。 –

+0

@JameyD,我只是编辑.. thanx .. :) – Haris

+0

谢谢! @JameyD – Naman

1

的问题,我看到它是在

scanf("%d",N); 

scanf("%d",M); 

它调用undefined behavior作为scanf()需要的参数的格式说明符是指向类型。

只是为了澄清,你本质上是通过地址0(变量的值),无论如何这不是一个有效的地址。

你需要有通过地址,像

scanf("%d", &N); 

scanf("%d", &M); 

这就是说,在你Union()功能,您使用的是用户定义的值来限制for环,对照恒定值20。如果用户输入超过20,则会超出调用undefined behavior的内存。

+0

哦,那么与内存分配无关?那么我会改变标题。谢谢。 – Naman

+0

@Naman是的,没错。它是UB。 –

0

您得到分段错误的原因是因为您在NM中读取时如何调用scanf%d格式说明符scanf预计为int *,即int的地址,但是您传递的是int。这是未定义的行为。

这样你就可以解决这些问题是这样的:

scanf("%d",&N); 
.... 
scanf("%d",&M); 

一些addtional错误:

当循环中的值来读取b

for(j=0;i<M;i++) 
{ 
    scanf("%d",&b[i]); 
} 

你打错循环指标:

for(j=0;j<M;j++) 
{ 
    scanf("%d",&b[j]); 
} 

当检查trigger

if(trigger =0) 

这是一个任务,而不是一个比较:

if(trigger == 0) 

当循环打印出u

for(i=0;i<unionIndex;unionIndex++) 

你增加了错误的变量:

for(i=0;i<unionIndex;i++) 

最后,u需要有至少set1 + set2的长度,否则你可能会注销数组的末尾:

int u[set1+set2]; 

修复这些,你应该得到想要的结果。