2016-10-03 128 views
0

我從輸入文件填充10 x 10個字符的網格。 我需要檢查如果電網是正方形(即,具有N×N個字符,其中N < = 10)c - 在二維數組中檢查null

輸入文件是這樣的:

pitk 
olpe 
pkey 
tope 

當我打印在gdb網格,我得到以下結果:

$1 = {"pitk\000\000\000\000\366h", 
     "olpe\000\000\001\000\000", 
     "pkey\000\000\000\000\000", 
     "tope\000\000\000\000\000", 
     "\000\344\241\367\377\177\000\000", <incomplete sequence \336>, 
     "\000\377\377\177\000\000\037\355\336", <incomplete sequence \367>, 
     "\000\177\000\000\000\000\000\000\000", 
     "\000\000\000\000\000\000\000\000\000", 
     "\000\000\000\000\000\000\000\000\r\020", 
     "\000\000\000\000\000\000\000\000\000"} 

我的主要功能來檢查,如果網格是有效的部分是:

bool check = (checknxn(grid)); 
    if(check == false) { 
    fprintf(stderr, "Invalid Input!\n"); 
    exit(0); 
    } 

的checknxn功能:

bool checknxn(char grid[10][10]) { 
    int columns = 0; 
    for(int i=0;i<10;i++) { 
    if(grid[0][i]!=NULL) 
     columns++; 
    else { 
     break; 
    } 
    } 

    for(int i=1;i<10;i++) { 
    for(int j=columns;j<10;j++) { 
    if(grid[i][j]!=NULL) 
     return false; 
    } 
    } 

    int rows = 0; 
    for(int i=0;i<10;i++) { 
    if(grid[i][0]!=NULL) 
     rows++; 
    else { 
     break; 
    } 
    } 
    if (!(rows == columns)) 
    return false; 
    for(int i=0;i<rows;i++) { 
    for(int j=0;j<columns;j++) { 
     if(grid[i][j]==NULL) { 
     return false; 
     } 
    } 
    } 
    return true; 
} 

這個返回false,我的程序退出,即使在這種情況下,輸入電網是有效的。

我不明白爲什麼在這種情況下checknxn函數返回false。

UPDATE:這是我如何初始化我網:

FILE *file1 = fopen(argv[1], "r"); // "r" for read 

    char grid[10][10]; 

    char c; 
    for(int i=0;i<10;i++){ 
    for(int j=0;j<10;j++){ 
     fscanf(file1,"%c", &c); 
     if (c == '\n') { 
     grid[i][j] = '\0'; 
     break; 
     } 
     if (c == ' ') { 
     grid[i][j] = '\0'; 
     continue; 
     } 
     if (c == '\0') { 
     grid[i][j] = '\0'; 
     continue; 
     } 
     else { 
     grid[i][j] = c; 
     } 
    } 
    } 
+0

您是否試過調試器(甚至是printf?)。給你的輸入,我可以看到它爲什麼失敗。也許首先將'i'和'j'重命名爲'row'和'col',使它更容易遵循... – John3136

+0

@ John3136我已經使用我的調試器來檢查網格的值,但沒有使用它在checknxn函數上,因爲我不確定如何在輔助函數上使用gdb。 – RockAndaHardPlace

+0

只是進入它。 – John3136

回答

1

經典C錯誤,未初始化數據。 Memset可能要走(見下文)。

memset(grid, 0, sizeof(grid[0][0]) * rows * columns); 
1

網格不完全初始化(您沒有設置細胞如:\0),所以你只有字符串和每行的開始正確定義。當你這樣做時,初始化網格,即不檢查單元格是否爲NULL,因爲它們不是指針而是實際內容,所以你檢查例如:\0如果已經將網格初始化爲該值。

編輯後從OP

附加信息來初始化網格,你可以這樣做

char grid[10][10]; 
for(int i=0;i<10;i++){ 
    for(int j=0;j<10;j++){ 
    grid[i][1j] = '\0'; 
    } 
} 

,然後才做餡料。不要混用它。

如果你想檢查是否電池充滿,那就是:不\0

for(int i=0;i<rows;i++) { 
    for(int j=0;j<columns;j++) { 
     if(grid[i][j] != `\0`) { 
     return false; 
     } 
    } 
    } 

但要加載C-串在它和C-串用\0結束。將字符串加載到單元格中,但不要跟蹤\0或調整迴路以檢查row_length-2而不是row_length -1

,如果你有一個字符串更簡單的方法:測量每行字符串的長度,如果他們都是相同的,行數對應的字符串長度你有一個方形網格。

+0

我試圖初始化我的網格有\'0而不是NULL(見上面的更新)和我的checknxn函數來檢查,但我仍然有同樣的問題... – RockAndaHardPlace