-1

これまでの私のコードは次のとおりです

#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");
//printf("\n how many rows and colums are there?  separate by a space: ");
 //  scanf("%d %d",&rows, &cols);

while(fgets(line, sizeof line, TableFilePtr) != NULL)
{
    for(cols=0; cols<(strlen(line)-1); ++cols)
    {
        puzzle[rows][cols] = line[cols];
    }
    /* I'd give myself enough room in the 2d array for a NULL char in 
       the last col of every row.  You can check for it later to make sure
       you're not going out of bounds. You could also 
       printf("%s\n", puzzle[row]); to print an entire row */
    puzzle[rows][cols] = '\0';
    ++rows;
}
/*int c;
for(c=0; c<MAXROWS; ++c){
    fgets(puzzle[rows], sizeof puzzle[rows], TableFilePtr);
}*/
printf("%s",puzzle[5][5]);
}

私がやりたいのは、txtファイルに単語検索を含むテキストファイルから読み取って、ランダムな文字だけになるようにすることです。パズル[5][5]と言えるようにしたいのですが、4行4列目の文字が得られます。セグメンテーション違反が発生していますが、修正方法がわかりません。

4

3 に答える 3

2

文字列を出力しようとしてprintf("%s", puzzle[rows][cols])いて、文字列でchar puzzle[rows][cols]はなく is 1 文字を指定しています。

これを行います:printf("%c", puzzle[rows][cols]);代わりに。

于 2013-03-25T02:49:06.130 に答える
0

文字を書き込むときにパズル配列の境界をチェックしなかったことを除いて、明らかなエラーは見られませんでした。考えられる理由は、入力ファイルが大きすぎてパズル配列に収まらないため、配列がオーバーフローしたためだと思います。

于 2013-03-25T03:11:19.417 に答える
0
char puzzle[MAXROWS][MAXCOLS];
char line[MAXCOLS];
//...
while(fgets(line, sizeof line, TableFilePtr) != NULL)
{
    for(cols=0; cols<(strlen(line)-1); ++cols)
    {
        puzzle[rows][cols] = line[cols];
    }
    puzzle[rows][cols] = '\0';
    ++rows;
}

行数が MAXROWS 未満であること、または各行の長さが MAXCOLS 未満であることを確認しないため、これは危険です。つまり、不正な形式のデータ ファイルにより、puzzle配列の境界を超えて書き込む可能性があり、セグメンテーション違反、メモリの破損、またはその他の問題が発生する可能性があります。

修正するには、次のようにループ条件に制限を含める必要があります。

while (frets(line, sizeof line, TableFilePtr) != NULL && rows < MAXROWS) {
    for (cols=0; cols<(strlen(line)-1) && cols < MAXCOLS; ++cols) {
        //...
于 2013-03-25T02:57:46.433 に答える