在c中生成单词指针数组

时间:2017-03-12 22:30:36

标签: c arrays pointers

我有一个问题,我必须将一个由264064字组成的文本文件读入缓冲区,然后在单独的数组中创建一个字指针数组。我不知道如何创建指向缓冲区中不同字符数量的字指针数组。关于如何解决这个问题的任何提示?

#include <stdlib.h>
#include <string.h>

int main()
{
    int i,wordCount=0;
    long bufsize;
    char ch;

    //Open File and get number of lines in file
    FILE *fp = fopen("words2.txt", "r");
    if (fp == NULL) {
        printf("Error!");
        exit(1);
    }
    do {
        ch = fgetc(fp);
        if (ch == '\n')
        {
            wordCount++;
        }

    } while (ch != EOF);
    fclose(fp);
    printf("%d\n",wordCount);

    //Reading Words into buffer rawtext
    char *rawtext;
    fp = fopen("words2.txt", "rb");

    if (fp != NULL)
    {
        if (fseek(fp, 0L, SEEK_END) == 0) {
            bufsize = ftell(fp);
            if (bufsize == -1) {
                exit(1);
            }
            rawtext = malloc(sizeof(char) * (bufsize + 1));

            if (fseek(fp, 0L, SEEK_SET) != 0) { exit(1); }

            size_t newLen = fread(rawtext, sizeof(char), bufsize, fp);
            if (ferror(fp) != 0) {
                fputs("Error reading file", stderr);
            } else {
                rawtext[newLen++] = '\0';
            }
        }
        //Print out buffer
        printf("%s",rawtext);
        fclose(fp);
        free(rawtext);//Free allocated memory

        char *ptr[wordCount];//Array for word-pointers
    }
}

1 个答案:

答案 0 :(得分:1)

如果保留rawtext(即不要释放它),可以使用strchr('\n')浏览内容,将数据存储到当前位置,检测每个新行char,终止在这个新行字符处的字符串,然后继续。因此,你的ptr - 数组将指向最后rawtext内的每个单词(这就是你不应该释放rawtext的原因,因为指针会指向无效的内存): / p>

以下代码应该有效:

char* currWord = rawtext;
int nrOfWords = 0;
char* newlinePos;
while ((newlinePos = strchr(currWord,'\n')) != NULL) {
  *newlinePos = '\0';
  ptr[nrOfWords++] = currWord;
  currWord = newlinePos + 1;
}
if (*currWord) {
  ptr[nrOfWords++] = currWord;
}

旁注:表达式char *ptr[wordCount]可能会将指针数组放在堆栈上,堆栈空间有限,至少小于堆。如果您的文件包含大量单词,则可能会出现问题。使用char *ptr = malloc((wordCount+1) * sizeof(char*))保留堆上的内存。另请注意wordCount之后的+1,表示最后一个单词未被新行终止。