存储字符串数组并循环直到文件末尾

时间:2017-06-02 05:22:12

标签: c file-io dynamic-arrays

我正在编写一个程序,其中我需要完成的任务之一是将文本文件的每一行(其名称通过命令行提供)存储为单独的字符串以供将来操作。

我的程序有两个问题。

首先是将字符串存储在数组中的问题。当我用字符串分配数组的索引时,一切正常。但是只要我释放()字符串以分配另一个字符串,两个字符串都会被删除。

userText[numStrings - 1] = currentString; 
/* Both userText at index and currentString hold the same value at this point */
free(currentString);
/* Both userText at index and currentString are free'd */

这可能是一件简单的事情,我不理解,我还是C的新手。

我遇到的第二个问题是,我不知道如何循环直到文件结束。我知道feof()存在,但这有点毫无意义,因为它只会在文件结束之后返回true,所以我将再次循环。

以下是代码: note 直到你在最后一个do / while循环中设置了一些条件才会运行。

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

int main(int argc, char** argv){

    char** userText = NULL;
    char* currentString = NULL;
    int currentStringSize = 0;
    int numStrings = 0;


    FILE* fp = fopen(argv[1],"r");


    do{

        numStrings++;
        currentStringSize = 0;
        do{
            currentStringSize++;
            currentString = (char*)realloc(currentString, currentStringSize * sizeof(char));
            fscanf(fp, "%c", &currentString[currentStringSize - 1]);

        }while(!(currentString[currentStringSize - 1] == '\n'));
        currentString[currentStringSize - 1] = '\0';

        userText = (char**) realloc(userText, numStrings * sizeof(char*));

        for (int i = 0; i < numStrings; i++){
            userText[i] = (char*) realloc(userText[i], currentStringSize * sizeof(char));
        }

        userText[numStrings - 1] = currentString;
        free(currentString);
        currentString = NULL;
        } while (//the end of the file *insert code here*);


    for (int i = 0; i < numStrings; i++){
        free(userText[i]);
    }
    free(userText);
    fclose(fp);

    return 0;
}

谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

这些行很成问题:

for (int i = 0; i < numStrings; i++){
    userText[i] = (char*) realloc(userText[i], currentStringSize * sizeof(char));
}

userText[numStrings - 1] = currentString;
free(currentString);

首先为userText[i]分配内存,覆盖userText中已存在的指针。

然后你只需覆盖你分配的最后一个指针,使你失去刚刚完成的分配。

最后,释放userText[numStrings - 1]指向的内存(指针和currentString指向同一内存)。

解决所有这些问题很简单:只做

userText[numStrings - 1] = currentString;

就是这样!这就是你所需要的一切。

正如评论中所提到的,需要使currentString成为空指针,然后再回到循环的顶部并调用realloc