2014-03-26 59 views
2

嘿,我試圖將一個矩陣存儲在一個字符數組中,然後將其打印出來。C在字符陣列中存儲矩陣和打印

我的代碼,我已經寫了:

#include<stdio.h> 
#include<stdlib.h> 
int main() { 
    int i; 
    int j; 
    int row=0; 
    int col=0; 
    int temp=0; 
    char c; 
    int array[3][2] = {{}}; 
    while((c=getchar()) !=EOF && c!=10){ 
    if((c==getchar()) == '\n'){ 
     array[col++][row]; 
     break; 
    } 
    array[col][row++]=c; 
    } 
    for(i=0; i<=2; i++){ 
    for(j=0; j<=3; j++){ 
     printf("%c ", array[i][j]); 
    } 
    printf("\n"); 
    } 
} 

使用文本文件如:

1 2 3 4 
5 6 7 8 
9 1 2 3 

我想能夠打印回給用戶,但是就是我代碼輸出是:

1 2 3 4 
3 4 5 6 
5 6 7 8 

我無法弄清楚我的代碼有什麼問題,有些如何關閉一個迭代我的循環,或者與不正確處理新行有關。謝謝!

+0

char數組在哪裏?爲什麼'char c'?爲什麼不''int c'? AFAIK空初始值設定項('int array [3] [2] = {{}};')不允許在C中。 – haccks

+0

你能向我解釋我的代碼幾乎工作嗎?另外,當我更改爲int c,並打印出整數而不是字符時,它是打印地址數字我相信,而不是存儲在每個數組中的元素。 – Blued00d

+0

應該是'array [3] [4]' – user3386109

回答

2

,我可以看到的幾個問題是:

  1. 正如在評論中提到user3386109,你的陣列應該是array[3][4]來匹配輸入文件。
  2. array[col++][row];什麼都不做,只是增加col,然後無用索引數組並丟棄該值。你可以用col++;做同樣的事情。然而,你甚至在代碼的任何一點都沒有使用col,所以你甚至不需要這個。 break;本身就是你所需要的。這導致我...
  3. 你不像你一樣填充陣列認爲你是。您正在增加col,然後立即跳出循環。那麼整個數組如何填充?只是純粹的運氣。事實上,你的數組聲明爲array[3][4],數組訪問array[0][4](甚至在技術上應該不存在)相當於array[1][0]。這是因爲所有多維數組(C語言和其他語言)均以平面數組的形式存儲在內存中,因爲內存本身使用線性尋址。在C語言中,這種扁平化多維數組的所謂Row-major order完成,這意味着當你穿越從第一個地址的原始內存持續,相應的多維指數(I,J,K,Z,或在您的情況只是我,j)以這樣一種方式增加,即最後一個索引將改變最快。因此,col不僅在你跳出循環之前不會增加,而且row也不會重置爲0,這意味着你正在按照您的預期將值存儲在array[0][0], array[0][1], ... array[0][11]而不是 。幸運的是,由於行排序,這兩組索引實際上是等價的(並且C沒有爲你做數組邊界檢查,因爲它假定你自己正在做)。
  4. 這只是個人喜好,但你會通常看陣列引用爲array[row][col]而不是array[col][row]。但就像我說的那樣,這只是偏好。如果您更容易將其形象化爲[col][row],那麼無論如何都要這樣做。只要確保您始終如一地執行此操作,並且不會在代碼中途意外切換到執行[row][col]
  5. 您的代碼將打破,只打印出矩陣的一部分,如果你不小心把尾隨的空間你的號碼行的一個結束,因爲你檢查輸入的結束奇怪的方式(做一個第二getchar每個初始getchar後並檢查是否所述第二字符是\n)。這種方法本身不是錯誤,因爲它可以工作,但它不是非常健壯,並且依賴於輸入數據被精確格式化並且不包含尾隨空格。任何曾花費數小時試圖弄清楚爲什麼他們的Makefile不起作用的人,只是發現這是因爲他們擁有前導空格而不是製表符,這可以證明這些錯誤可能非常耗時,令人沮喪追查。精確格式化的輸入數據總是一件好事,但當沒有獲得完美輸入時,您的代碼不應該以意想不到的方式突破(例如僅打印一半矩陣)。 編輯:它後來才發生,你實際上是打算在這裏做兩個相互排斥的事情:增加col爲下一行的輸入,並有(大概)檢測到後結束循環輸入。你需要弄清楚你在做什麼,儘管感謝項目#3,你的代碼實際上(和奇怪地)只是通過採取user3386109的建議和更改array[3][2]array[3][4]
  6. 我只能假設你在for循環中分別使用了<= 2和而不是< 3< 4,因爲你更喜歡這樣做。這很好,但如果您的for環路條件與您的陣列尺寸匹配,它通常會使代碼更容易閱讀。只是在這裏推測,但也許這就是爲什麼當你真的意指array[3][4]時你有array[3][2]