我正在编写一个程序,其中我需要完成的任务之一是将文本文件的每一行(其名称通过命令行提供)存储为单独的字符串以供将来操作。
我的程序有两个问题。
首先是将字符串存储在数组中的问题。当我用字符串分配数组的索引时,一切正常。但是只要我释放()字符串以分配另一个字符串,两个字符串都会被删除。
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", ¤tString[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;
}
谢谢你的帮助。
答案 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
。