2015-10-06 55 views
1

我試圖在用戶指定的列數中顯示數組的元素。他們決定數組的大小以及它將顯示多少列。現在,我正在列中打印數組的元素,但是,我有多餘的行和列中的數字不在數組中。因此,如果我選擇數組的大小和列數爲5 3,我希望看到:在C語言的用戶指定列中打印單維數組

1 3 5 
2 4 

相反,我得到的是這樣的:

1 3 5 
2 4 107863456 
128976543 58764 896543221 
5643217 90876543456 8976543 

我得到3列,4行。我不知道爲什麼會發生這種情況。下面是與創建列涉及我的代碼的部分,讓我知道如果需要更多的代碼(x是一個變量,其保持數組的大小,y成立列數):

void colDisplay(int *aPtr, int x, int y) { 
    int i, j; 

    srand(time(NULL)); 

    for(i = 0; i < x; i++) { 
     aPtr[i] = rand()%5+1; 
    } 

    /*Trying to format display for number of columns used*/ 
    printf("Unsorted columns\n"); 
    for(i = 0; i < x; i++) { 
     for(j = 0; j < y; j++) { 
      //printf("%d = %d ", (i*y)+j, aPtr[(i*y)+j]); 
      printf("%d ", aPtr[(i*y)+j]); 
     } 
     printf("\n"); 
    } 
} 
+0

你的循環結構是不是做你打算什麼。您正在執行總共'x * y'個打印語句。事實上,你只需要總共'x'印刷品。這也意味着你的'aPtr'數組訪問超出邊界,因此也就是垃圾數據。 – kaylum

回答

2

內環被計數列正確,但外循環使用x作爲行計數,而不是項目計數。要解決這個問題,您可以使用一個計數項目的單一循環,並在正確的時間輸出換行符。

j = 0; 
for (i = 0; i < x; i++) 
{ 
    printf("%d ", aPtr[i]); 
    j++; 
    if (j == y || i == x-1) 
    { 
     printf("\n"); 
     j = 0; 
    } 
} 
+1

這解決了它,謝謝。 – Robert

1

我同意@ user3386109的解決方案。

此外,下面的變化將有助於:

Original 'for' loop with j: 
for(j = 0; j < y; j++) 
Modified code: 
for (j = 0; (j < y) && (i*y+j < x); j++) 

原因:指數= I * Y + j可以超過x如果(!X%Y = 0),即,如果x(數組大小)是不完整y的倍數(顯示列大小)。

0

由於數組索引超出限制。

你應該做到以下幾點:

for(i = 0; i >= 0; i++) { 
    boolean isContinue = true; 
    for(j = 0; j < y; j++) { 
     int index = i*y+j; 
     if(index==x){ 
      isContinue = false; 
      break; 
     } 

     printf("%d ", aPtr[(i*y)+j]); 
    } 
    if(!isContinue){ 
     break; 
    } 
    printf("\n"); 
}