0

単語検索を使用するプログラムがあります。パズルと単語を含むデータ ファイルがあります。ファイルを読み取り、その中に存在する文字を配列として格納するために、プログラムに何を実装できますか?

データ ファイルの例 (testdata と呼ばれます):

h e l l o a c d 
f g b w o r l d
h a c c v b n a 
e q b x n t q q 
y e h n c a q r
hello
world
hey

すべての文字を 2 次元配列に格納したいと考えています。また、すべての単語を 1 次元配列に格納する必要があります。

データファイルで可能な文字の AxA 四角形の列または行の最大行数は 25 です。したがって、文字に対してそのサイズの配列を宣言し、その配列に書き込む必要があると思います。

それらをその配列に読み込む方法がわかりません。配列の各文字の後にスペースがあり、単語にはスペースがないため、文字をある配列に入れ、単語を別の配列に入れるときに役立つと思います。

4

2 に答える 2

1

必要なものを探して、ファイルを1行ずつ、1文字ずつ解析します。この例 (テストされていません) では、配列を正しく埋めるために 3 つのカウンターを保持しています。

char letters[25][25];
char words[10][25]

int letters_x_pos = 0; // Row counter
int letters_y_pos = 0; // Column counter
int words_pos = 0;

for (int i = 0; i < 25; i++) {
    for (int j = 0; j < 25; j++) {
        letters[i][j] = '\0';
    }
}

const char *line;
while (line = some_read_function()) {
    if (!(strlen(line) > 1)) {
        continue;
    }

    if (line[1] == ' ') {
        // Line contains letters
        const char *letter = line;
        while (*letter != '\0') {
            if (*letter == ' ' || *letter == '\n' || *letter == '\r') { 
                continue;
            }
            else {
                letters[letters_x_pos][letters_y_pos++] = *letter;
            }
            if (letters_y_pos == 25) {
                // Maximum reached
                break;
            }
            letter++;
        }
        // Increment row counter and reset column counter
        letters_x_pos++;
        letters_y_pos = 0;
        if (letters_x_pos == 25) {
            // Maximum reached
            break;
        }
    }
    else {
        // Line contains word
        strncpy(words[words_pos++], line, 25);
        if (words_pos == 25) {
            // Maximum reached
            break;
        }
    }
}
于 2013-10-13T21:47:32.853 に答える
1

あなたの質問とあなたの入力を考えると、いくつかの質問がありますが、時間の都合上、今のところ、配列の次元についていくつかの仮定を立てました。そのAxAスクエア)。実際のデータ サンプルは一致しないので、すべてをカウントするルーチンを作成しました。文字配列は単なる配列の配列ですが、シーケンシャル メモリに格納されるため、1 つの長い配列のように見えます。文字列もそれぞれ独自の場所にあります。いずれにせよ、このコードは、あなたを正しい軌道に乗せるために十分に説明する必要があります...

#include <ansi_c.h>
#include <stdio.h>

void GetFileContents(char *file, int *nWords, int *lw, int *r, int *c);
void allocMemoryStr(int numStrings, int max);
void allocMemoryLtr(int numStrings, int max);
void freeMemoryStr(int numStrings);
void freeMemoryLtr(int numletters);
#define FILENAME "c:\\dev\\play\\_puzzle.txt"

char **letters;
char **strings;

int main()
{
    int  longest, cnt,  wCount, rows, cols, i;
    char line[260];
    FILE *fp;
    char *buf=0;

    GetFileContents(FILENAME, &wCount, &longest, &rows, &cols);

    allocMemoryStr(wCount, longest); //for strings
    allocMemoryLtr(rows*cols, 1); //for strings

    //read file into string arrays 
    fp = fopen(FILENAME, "r");
    cnt=0;
    for(i=0;i<rows;i++)
    {
        fgets(line, 260, fp);
        buf = strtok(line, " \n");
        while(buf)  
        {
            strcpy(letters[cnt], buf);
            buf = strtok(NULL, " \n");
            cnt++;                      //use as accurate count of words.
        }
    }
    cnt=0;
    while(fgets(line, 260, fp)) //get remainder of lines into strings
    {
        //[EDIT]removed fgets()
        buf = strtok(line, " \n");
        while(buf)  
        {
            strcpy(strings[cnt], buf);
            buf = strtok(NULL, " \n");
            cnt++;                      //use as accurate count of words.
        }
    }
    fclose(fp);
    freeMemoryStr(wCount);
    freeMemoryLtr(rows*cols);
    return 0;
}

void GetFileContents(char *file, int *nWords, int *lw, int *r, int *c)
{
    char line[260];
    FILE *fp;
    char *buf=0;
    char temp[80];
    int wc=0, rc=0, cc=0, ck=0;

    fp = fopen(FILENAME, "r");
    while(fgets(line, 260, fp))
    {
        rc++;
        buf = strtok(line, " \n");
        while(buf)  
        {   
            strcpy(temp, buf); // word handler
            if(strlen(temp) > 1) 
            {
                wc++;
                rc--; //
            }
            else if(strlen(temp) == 1) //leter handler
            {
                cc++;
                (cc>ck)?(ck=cc):(cc=cc);
            }
            buf = strtok(NULL, " \n");
        }
        cc = 0;
    }
    fclose(fp);
    *nWords = wc;
    *r = rc;
    *c = ck;
}

void allocMemoryStr(int numStrings, int max)
{
    int i;
    strings = calloc(sizeof(char*)*(numStrings+1), sizeof(char*));
    for(i=0;i<numStrings; i++)
    {
      strings[i] = calloc(sizeof(char)*max + 1, sizeof(char));
    }
}
void allocMemoryLtr(int numletters, int max)
{
    int i;
    letters = calloc(sizeof(char*)*(numletters+1), sizeof(char*));
    for(i=0;i<numletters; i++)
    {
      letters[i] = calloc(sizeof(char)*max + 1, sizeof(char));
    }
}

void freeMemoryStr(int numStrings)
{
    int i;
    for(i=0;i<numStrings; i++)
        if(strings[i]) free(strings[i]);
    free(strings);  
}
void freeMemoryLtr(int numletters)
{
    int i;
    for(i=0;i<numletters; i++)
        if(letters[i]) free(letters[i]);
    free(letters);  
}
于 2013-10-14T03:24:52.730 に答える