我有一个使用单词搜索的程序。我有一个包含拼图和单词的数据文件。我可以在程序中实现什么,以便它读取文件并将其中的字母作为数组存储?
数据文件的示例(称为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

我想把所有的字母都存储在二维数组中。
另外,我需要将所有单词存储在一维数组中。
数据文件中可能的字母AXA平方的最大行数或行数为25行。所以,我认为我应该为字母声明一个大小相同的数组,然后将它们写入该数组。
我只是不知道如何把它们读入数组。数组中的每个字母后面都有一个空格,而单词中没有空格,所以我认为这可能有助于将字母放在一个数组中,将单词放在另一个数组中。

最佳答案

考虑到您的问题和您的输入,有几个问题,但为了时间的考虑,目前,我已经对数组的维数做了一些假设,即它不一定是正方形的(正如AxA正方形的列或行所暗示的那样)。实际的数据样本不一致,所以我编写了一个例程,可以对所有数据进行计数。字母数组只是数组的一个数组,但是由于它存储在顺序存储器中,所以看起来就像一个长数组。字符串也都在各自的位置。无论如何,这段代码应该足够说明问题,让您走上正确的轨道。。。

#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);
}

10-01 23:00
查看更多