2016-10-03 133 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