2016-10-03 11 views
0

入力ファイルから10 x 10グリッドの文字を入力しています。 私はグリッドが正方形であるかどうかを確認する必要がc - 2次元配列のnullを確認する

入力ファイルは、である(すなわち、N < = 10 N×N個の文字を持つ):

pitk 
olpe 
pkey 
tope 

Iは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

古典的なデータを初期化していない間違い。 memsetおそらく行く方法(下記参照)。

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

あなたのグリッドが初期化さ完全(あなたがたとえばにごとのセルを設定しませんでした:\0)ではありませんので、あなただけの文字列を持っているし、すべての行の開始が適切に定義されています。セルをNULLにするのはポインタではなく実際の内容なので、セルをチェックしないようにグリッドを初期化します。例:\0グリッドをその値に初期化していればチェックします。あなたは

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

ような何かを行うだけにして充填を行うことができ、グリッドを初期化するために、OP

からの追加情報の後

EDIT。それを混ぜないでください。

あなたはすべてのセルが満たされているかどうかを確認したい場合は、それは次のようになりますない\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 -1の代わりにrow_length-2にチェックするループを調整します。

あなたは、文字列を持っている場合は非常に簡単な方法:すべてので文字列の長さを測定し、それらがすべて同じであると行の数は、文字列の長さに対応する場合は、正方形のグリッドを持っています。

+0

私はグリッドを初期化しようとしました 'NULLの代わりに\ 0(上の更新を参照してください)と私のchecknxn関数をチェックするが、私はまだ同じ問題を抱えている... – RockAndaHardPlace