2013-08-19 23 views
1

因此,我有一個賦值要求我比較2個整數數組(a [5]和b [8]),並檢查重複元素使用指針。 到目前爲止,這裏的代碼我想出了:檢查指針是否指向int數組上的空白空間

int main(void) { 
    int *pa, i, j, sizeA=5, sizeB=8, a[sizeA], b[sizeB], aux[sizeB]; 
    for (i=0; i<sizeA; i++){ 
     scanf("%d", &a[i]); 
    } 
    for (i=0; i<sizeB; i++){ 
     scanf("%d", &b[i]); 
    } 
    for (i=0; i<sizeB; i++){ 
     aux[i] = NULL; 
    } 
    for(i=0;i<sizeA; i++){ 
     for(j=0; j<sizeB; j++){ 
      if ((a[i] == b[j])) 
       aux[i] = b[j]; 
     } 
    } 
    for(i=0;i<sizeA; i++){ 
     pa = &aux[i]; 
     if ((pa != NULL)&&(*pa!=aux[i+1])){ 
      printf("%d \n", *pa); 
     } 
    } 


    return (EXIT_SUCCESS); 
} 

它得到了編譯並沒有錯誤運行,但是當沒有重複的元素,最後一個for循環打印出奇怪的值,如435304.

我試圖通過數組「aux」使指針「pa」掃描,並且只打印與數組上的下一個元素不同的元素,並檢查指針指向的位置是否爲空。

任何提示?

編輯:我解決了它與NULL值初始化輔助數組。它算作一個有效的解決方案嗎?有沒有更好的方法來做到這一點?

編輯2:感謝所有幫助過我的人。祝你今天愉快。

+1

這些垃圾值... – someone

+0

據我瞭解的地方值使用指針進行分配的好處是不必預先分配aux的大小。 – phoenixgr

+0

將「NULL」賦值給一個整數將其設置爲「0」。那麼'0'是'a'和'b'的條目的有效值嗎? – alk

回答

1

你只寫什麼是平等的aux,這意味着aux內容將是B的內容的子集,但你有sizeB大小聲明它,而不是initilizing它的內容。這意味着在創建時,aux的內容都是內存垃圾。因爲通過子集定義,你不需要書寫就可以離開aux的位置(除非A = B),這些未寫入的位置保持不成文,因此最終包含gargabe。初始化它來避免這個問題:

int myArray[10] = { -1 }; //all elements to -1 

而且在找到-1,或者你想用標記的空位置的任何其他值停止迭代。

+0

如果沒有整數值可能用於標記一個空位置,那麼整數的整個ranage可能被用作輸入,該怎麼辦? – alk

+0

然後聲明一個int count = 0,每找到一個匹配就增加一個,然後用這個計數作爲最後一個循環的迭代限制。 – bluehallu

0

您應該正確地啓動aux(c不會默認填充零,這是您的奇怪值來自哪裏),並添加一個計數器來計算您找到的匹配數量,而不是在最後一個循環中使用i < sizeA

1

你的問題是aux是一個堆棧符號。考慮到它抵消了地址&aux[i]將始終返回非NULL,因爲它在堆棧上。您正在使用預定義數組元素的地址。

如果你的目的是保存指針aux那麼你需要將它定義爲int *

int * aux[sizeB]; 
memset(aux, 0, sizeof(aux)); // don't forget to initialise it 

數組,當你爲它分配您指定的地址在那裏。既然你要複製的數據從baux

for(i=0;i<sizeA; i++){ 
     pa = aux[i]; 
     if ((pa != NULL)&&(*pa!=*(aux[i+1]))){ 
      printf("%d \n", *pa); 
     } 
    } 
+0

我只是想讓指針pa指向aux陣列上的每個佔用位置。我可以用空值初始化aux數組來解決它 – Pedro

+0

@Pedro你可以,但是'if(pa!= NULL)'是沒用的。 'pa'永遠不會是'NULL'。那麼你又如何解釋'a'和'b'中的零值?如果你用'0'初始化'aux'(不是'NULL',除非它是一個指針數組),那麼你如何區分'a,b'中的重複零與初始化的零有關? –

0

for(i=0;i<sizeA; i++){ 
     for(j=0; j<sizeB; j++){ 
      if ((a[i] == b[j])) 
       aux[i] = &b[j]; 
     } 
    } 

而且在循環剛纔讀的地址。

if ((a[i] == b[j])) 

指出如果它是真的,則複製數據。那麼告訴我們你的意見是什麼?

由於您沒有在兩個陣列中獲得公共數據。它正在打印垃圾值。

對於解決方案:

在兩個數組只需提供相同的數據,你會得到你的輸出。

0

AUX有哪些是默認

第一套輔助的所有值都爲0或運行一個計數器,直到其中AUX已經充滿