c – 在2d数组中检查null
我从输入文件中填充10 x 10个字符的网格。 我需要检查网格是否是正方形(即,有N×N个字符,其中N <= 10)
输入文件是这样的:
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", , "\000\377\377\177\000\000\037\355\336", , "\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。
更新:这是我初始化网格的方式:
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; } } }
经典C错误没有初始化数据。 Memset可能是要走的路(见下文)。
memset(grid, 0, sizeof(grid[0][0]) * rows * columns);
您的网格未完全初始化(您没有将每个单元格设置为例如: \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
但是你想在其中加载C-string而C-strings以\0
结尾。 将字符串加载到单元格中而不使用尾部\0
或调整循环以检查row_length-2
而不是row_length -1
。
如果你有字符串,一个更简单的方法:测量每一行中的字符串长度,如果它们都是相同的,行数对应于字符串长度,你有一个方格。