2015-02-11 47 views
1

我目前正在研究一個數獨驗證器,而我所做的方式是將每行分隔成長度爲9的數組並檢查,將每列分隔成一個長度數組9和檢查等我已經做了行已經做了這樣的事情如何掃描文件中的某些字符

  for(i=0; i<9; i++) 
     fscanf(file, "%1d", &row1[i]); 
      for(i=0; i<9; i++) 
     fscanf(file, "%1d", &row2[i]); 
      for(i=0; i<9; i++) 
     fscanf(file, "%1d", &row3[i]); 
      for(i=0; i<9; i++) 
     fscanf(file, "%1d", &row4[i]); 

它的工作方式我也想。

我在我的數獨解決方案中的每個數字都被一個空格水平分隔,並且在我的文件中垂直相鄰。

但是,我試圖將每列掃描到一個數組時遇到問題。基本上我想我需要做的是從第一個(左上角)字符開始第一列,並將其存儲到我的陣列的第一個插槽中。然後,我需要跳過9個字符,然後存儲該字符。

我想我可以做同樣的事情像

  for(i=0; i<82; i += 9) 
     fscanf(file, "%1d", &col1[i]); 
      for(i=1; i<82; i+=9) 
     fscanf(file, "%1d", &col2[i]); 
      for(i=2; i<82; i+=9) 
     fscanf(file, "%1d", &col3[i]); 
      for(i=3; i<82; i+=9) 
     fscanf(file, "%1d", &col4[i]); 
      for(i=4; i<82; i+=9) 

但我意識到它沒有工作,因爲我已經把我的數組大小9,因爲我被插入到第i個值在數組中這會不像其想要的那樣行事。

任何人都可以給我一個建議,我怎麼能實現這個?我認爲這是相當微不足道的,但我有嚴重的麻煩纏着它。

感謝

編輯:我還需要爲區域做到這一點,所以我基本上是在尋找一種方式來通過文件跳過和存儲,我想只有某些字符。

+0

您必須檢查你真的在掃描這些值,總之檢查'fscanf()'的返回值。 – 2015-02-11 21:27:44

回答

3

由於它是一個數獨驗證程序,所以創建一個9 * 9的二維數組並讀取明智的行數與您正在做的很像。然後循環通過明智或明智的列來驗證你的數獨廣場。

// As pointed out in comments, this code assumes you have a minimum of 9*9 separated ints with width = 1. 
// If not, you need to check whether fscanf failed or not. 
int sudoku[9][9] ; 
for(int i = 0; i < 9; ++i) 
    for(int j = 0; j < 9; ++j) 
     fscanf(file_ptr, "%1d", &sudoku[i][j]); /* Check for the return value 
               * of fscanf if it is not 
               * guaranteed that there 
               * will always be 81 elements 
               * to read from or some other 
               * error occurred while 
               * reading the file. 
               */ 

// now use sudoku to verify. 
for(int i = 0; i < 9; ++i) 
    for(int j = 0; j < 9; ++j) 
    { 
     // sudoku[i][j] is row wise. 
     // sudoku[j][i] is column wise. 
    } 

我假設你正在使用C99或向上編譯器。如果是C89,則需要在函數的開頭(循環外部)移動int iint j聲明。

+0

首先,你的'fscanf()'是錯誤的,其次它會在你修正它時出錯,因爲你不檢查它的返回值,這是有原因的,你不覺得嗎? – 2015-02-11 21:28:33

+0

錯過了'FILE'指針。我的錯。在評論中還提到代碼是如何受限制的。 – 2015-02-11 21:33:24

+0

你沒有想到C++編譯器,有時他們在不知道'C++!= c'的情況下使用它們。 – 2015-02-11 21:34:57

0

使用簡單的過濾器,將所有計數和跳過並作爲單個字符讀取。畢竟,您只對從19的81個數字感興趣,這將使總是以正確的順序出現 - 無論其他格式化或分段如何。如果您還包括對未知細胞0.,你可以閱讀的格式,如本

1..|...|7.. 
.2.|...|5.. 
6..|38.|... 
----------- 
.78|...|... 
...|6.9|... 
...|...|14. 
----------- 
...|.25|..9 
..3|...|.6. 
..4|...|..2 

而且這個

000605000003020800045090270500000001062000540400000007098060450006040700000203000 

(例子來自http://www.sudocue.net/fileformats.php隨機挑選)

相關問題