0

基本的に単語検索形式のランダムな文字を含むファイルがあります。printf("the value is %c",puzzle[2][2]); のようなものを入力できるように、すべての文字を取得して 2D パズル配列に入れたいと思います。そして、3行目と3列目に値を出力します(0から始まるため...)これまでのコードは次のとおりです。

#define MAXROWS     60
#define MAXCOLS     60
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

main() {
    char TableFileName[100];
    char PuzzleFileName[100];
    char puzzle[MAXROWS][MAXCOLS];
    char line[MAXCOLS];
    FILE *TableFilePtr;
    int cols = 0;
    int rows = 0;
    printf("Please enter the table file name: ");
    scanf("%s",TableFileName);

    /* ... */

    TableFilePtr = fopen(TableFileName, "r");

    while (fgets(line, sizeof line, TableFilePtr) != NULL && rows < MAXROWS) {
        for (cols; cols<(strlen(line)-1) && cols < MAXCOLS; ++cols) {
            puzzle[rows][cols] = line[cols];
        }
        ++rows;
    }
    printf("%c",puzzle[2][2]);
}

プログラムが実行されると、パズル[x] [y]には値が含まれません。何か案は?

update1: cols を for cols=0 に変更 update2: 追加された printf("\nthe rows are at %d, cols at %d, puzzle[%d,%d]=%c line[cols]=%c",rows ,cols,rows,cols,puzzle[rows,cols],line[cols]); for loop update3: update 2 の後、line[cols] 文字がパズル内のすべての文字を取得していることがわかりますが、正しい順序ではありません。また、行 [列] がパズル [行] [列] に正しく配置されていません。私が見ているもののいくつかをここに示します(なぜそれをコードとして入れているのかわかりませんが、何でも):

the rows are at 0, cols at 0, puzzle[0,0]=l line[cols]=A
the rows are at 0, cols at 1, puzzle[0,1]=▒ line[cols]=
the rows are at 0, cols at 2, puzzle[0,2]=▒ line[cols]=B
the rows are at 0, cols at 3, puzzle[0,3]=  line[cols]=
the rows are at 0, cols at 4, puzzle[0,4]=\ line[cols]=D
the rows are at 0, cols at 5, puzzle[0,5]=▒ line[cols]=
the rows are at 0, cols at 6, puzzle[0,6]=▒ line[cols]=E
the rows are at 0, cols at 7, puzzle[0,7]= line[cols]=
the rows are at 0, cols at 8, puzzle[0,8]=L line[cols]=Q
the rows are at 0, cols at 9, puzzle[0,9]=▒ line[cols]=
the rows are at 0, cols at 10, puzzle[0,10]=▒ line[cols]=T

A、B、D、E、A、Tは正しいですが... Aはパズル[0,0]、Bは[0,1]、Dは[0,2]など...

ここに入力のサンプラーがあります... (txtファイルにあるでしょう)

K N R D J P L H X E K B W M X A M U Y A L E F Q N D L D  
B D B S W W M T F B K Z D G A L V L K U N U R C R I E I  
H N L A N D N T O V P O G R U U Y X E D L Y R M Q D T T  
Y C G Y E M A S I E X P V Z N W H X B D G G R T K V C W  
M Y C X A M I E U T Z J U O C N F F L R E F B T D R Y W  
R K V A C B H G L C F D Y X R Z Q E R E H N Q D S J H T  
R G E N Y Y K F J V G S C G D H O G K A F E M I S S Q P 
S J Z A B V A A P E E P R K F T A H W C G B J N N L W B 
F V F Z Y T V Y E O C Y A D L Q Q P P F V W K M E U V O 
4

3 に答える 3

0

test.c

#define MAXROWS     60
#define MAXCOLS     60
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

main()
{
char TableFileName[100];
char PuzzleFileName[100];
char puzzle[MAXROWS][MAXCOLS];
char line[MAXCOLS];
FILE *TableFilePtr;
int cols;
int rows;
cols=0;
rows=0;
printf("Please enter the table file name: ");
scanf("%s",TableFileName);

TableFilePtr = fopen(TableFileName, "r");

while (fgets(line, sizeof line, TableFilePtr) != NULL && rows < MAXROWS) {
    char *p=line;
    for(cols=0;NULL != (p=strtok(p, " \n")) && cols < MAXCOLS; ++cols){
        puzzle[rows][cols]=*p;
        p=NULL;
    }
    ++rows;
}
{   //check puzzle[][] print out
    int r, c;
    for(r=0;r<rows;r++){
        for(c=0;c<cols;c++){
            printf("%c", puzzle[r][c]);
        }
        printf("\n");
    }
}
printf("%c",puzzle[2][2]);
}

data.txt

K N R D J P L H X E K B W M X A M U Y A L E F Q N D L D  
B D B S W W M T F B K Z D G A L V L K U N U R C R I E I  
H N L A N D N T O V P O G R U U Y X E D L Y R M Q D T T  
Y C G Y E M A S I E X P V Z N W H X B D G G R T K V C W  
M Y C X A M I E U T Z J U O C N F F L R E F B T D R Y W  
R K V A C B H G L C F D Y X R Z Q E R E H N Q D S J H T  
R G E N Y Y K F J V G S C G D H O G K A F E M I S S Q P 
S J Z A B V A A P E E P R K F T A H W C G B J N N L W B 
F V F Z Y T V Y E O C Y A D L Q Q P P F V W K M E U V O 

プログラムの実行結果:

Please enter the table file name: data.txt
KNRDJPLHXEKBWMXAMUYALEFQNDLD
BDBSWWMTFBKZDGALVLKUNURCRIEI
HNLANDNTOVPOGRUUYXEDLYRMQDTT
YCGYEMASIEXPVZNWHXBDGGRTKVCW
MYCXAMIEUTZJUOCNFFLREFBTDRYW
RKVACBHGLCFDYXRZQEREHNQDSJHT
RGENYYKFJVGSCGDHOGKAFEMISSQP
SJZABVAAPEEPRKFTAHWCGBJNNLWB
FVFZYTVYEOCYADLQQPPFVWKMEUVO
L
于 2013-03-25T23:32:45.613 に答える
0

コードを実行すると、パズル配列のテキスト ファイルから実際の値を取得しています。それらの値をどこに置くかについてあなたは間違っていると思います。解析している内容の例が含まれていないため、何をしているのかわかりませんが、パズル配列で値を取得していることは間違いありません。

ファイルが次のようになっている場合: 1 2 3 4 5 6 7 8 9 10 の場合、 puzzle[0] の最初の 3 つの要素は "1"、" "、"2" であり、 puzzle の他のすべての要素は null です。

少し遊んだ後、何が問題のように見えるかを理解しました。cols を上に宣言し、ループ内で再利用しています。したがって、行がインクリメントされても、列はリセットされません。列を追加 = 0; 行++の後、配列は必要なように動作するようです。

編集:主にスタイルのもの。

1 つには、while ループ内で for ループを使用していますが、これは多次元配列を反復処理するのには奇妙に思えます。誤解しないでください。基本的には同じものです。しかし、読みやすくするために、通常、行と列でこのようなことを行うときは、while(while) または for(for) を実行する方が理にかなっています。

また、while ループの最後で列をリセットして行をインクリメントする代わりに、for ループに変更してみてください。for ループの宣言でインクリメンタを宣言すると、これらの間違いを心配する必要がなくなり、より読みやすい IMO になります。

また、今のところ最後の注意点として、char 配列で sizeof を使用する際には非常に注意する必要があることに気付いていないかもしれません。sizeof には char 配列に null ターミネータが含まれているため、sizeof を fgets の maxint として使用しません (この投稿C++: sizeof a char array using sizeof を参照) 。

私は ac の専門家ではないので、おそらくもっと多くのことをここで言う必要があります (ファイルから行を取得する方法はたくさんあり、fgets が推奨されるルートではないと思います) が、私が考えることができるのはこれだけですうまくいけば、少なくともそれを適切に実行するのに役立ちます.

于 2013-03-25T04:12:45.000 に答える
-1
while (fgets(line, sizeof line, TableFilePtr) != NULL && rows < MAXROWS) {
/*
    for (cols=0; cols<(strlen(line)-1) && cols < MAXCOLS; ++cols) {
        puzzle[rows][cols] = line[cols];
    }
*/
    char *p=line;
    for(cols=0;NULL != (p=strtok(p, " \n")) && cols < MAXCOLS; ++cols){
        puzzle[rows][cols]=*p;
        p=NULL;
    }
    ++rows;
}

テスト印刷コード サンプル:

{   //check puzzle[][] print out
    int r, c;
    for(r=0;r<rows;r++){
        for(c=0;c<cols;c++){
            printf("%c", puzzle[r][c]);//do you mistake like this puzzle[r,c] ?
        }
        printf("\n");
    }
}
于 2013-03-25T10:52:58.847 に答える