2016-02-05 62 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]; 

修復這些,你應該得到想要的結果。