2017-04-13 117 views
1

我有這段代碼,不知道爲什麼我的輸出不正確。我已經習慣了C++使用不C.二維數組輸出值不正確

運行:./sudoku.o < inputfile中

int row = 8; 
int col = 8; 
int puzzle[row][col]; 

for (int r = 0; r < row; r++){ 
    for (int c = 0; c < col; c++){              
     scanf("%d", &puzzle[r][c]); 
    } 
} 
for (int r = 0; r < row; r++){ 
    for (int c = 0; c < col; c++){ 
     printf("%d", puzzle[r][c]); 
    } 
    printf("\n"); 
} 

這是我輸入

827154396 
965327148 
341689752 
593468271 
472513689 
618972435 
786235914 
154796823 
239841567 

,這是我得到的輸出

-132765-84896035232594-208491627232765-208491623232765 
00-84896120832594-84897084832594-85115713632594 
10-848970848325941000 
10-8489612083259400-208491648032765 
1700966438000-84896035232594-208491641632765 
-20846176001-208491643232765-163754450041951850 
-1000-85506816832594-84897220032594 
0000-20849160083276500 
+0

您已經沒有檢查'scanf()'的返回值。你應該。 (你可以使用'if(scanf(「%d」,&puzzle [r] [c])!= 1){... report error ...}')。 –

+0

我該怎麼做? –

+1

但是,您真正的問題是您想讀取1位數字,但是您的代碼會讀取9位數字,直到您用完輸入。您需要使用'「%1d」'將輸入限制爲單個數字。如果你測試了'scanf()'的結果,你會發現這個麻煩,因爲在你的輸入循環完成之前它會說EOF。 –

回答

4

正如評論中指出的那樣,您應該檢查scanf()是否成功(在此c ontext,返回1),並且您需要確保它只讀取"%1d"的單個數字。就像這樣:

#include <stdio.h> 

int main(void) 
{ 
    int row = 8; 
    int col = 8; 
    int puzzle[row][col]; 

    for (int r = 0; r < row; r++) 
    { 
     for (int c = 0; c < col; c++) 
     { 
      if (scanf("%1d", &puzzle[r][c]) != 1) 
      { 
       fprintf(stderr, "Failed to read puzzle[%d][%d]\n", r, c); 
       return 1; 
      } 
     } 
    } 
    for (int r = 0; r < row; r++) 
    { 
     for (int c = 0; c < col; c++) 
     { 
      printf("%d", puzzle[r][c]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 

與您的數據文件,輸出(驚奇,驚奇):

82715439 
69653271 
48341689 
75259346 
82714725 
13689618 
97243578 
62359141 

「啊」,你說, 「我想每行9號」。但是你的代碼不會這麼說;您將rowcol設置爲8,因此您只能讀取矩陣的每行8個數字,並且只能讀取8行。和日期的第一行上的第九號變成你的矩陣的第二行的第一個號碼等

更改極限,以9比得到你真正想要的結果:

827154396 
965327148 
341689752 
593468271 
472513689 
618972435 
786235914 
154796823 
239841567 

如果您想逐條線路輸入(不一定是一個壞主意),你需要使用fgets()(或者POSIX getline())讀取行,然後 sscanf()閱讀的數字 - 見How to use sscanf() in loops?