【发布时间】:2023-03-19 08:06:01
【问题描述】:
函数char** read(char file[])应该返回一个字符串数组,每个字符串代表一个从json文件中提取的Json对象。
char* Purge(char S[], int n) 从字符串(从 json 文件中提取)中删除 ' '(空格)、'"'、','、'\t'。
主要问题是while循环中的第一条语句seBuffer = Purge(Buffer, strlen(Buffer) + 1);它使用Purge函数的方式太多次,对于已经检查过的字符,它从头到尾一直发生一个 json 对象,这是我应该担心的事情吗?还是有其他可能更有效的方法?
char** read(char file[])
{
FILE* pF = fopen(file, "r");
if(pF == NULL)
{
exit(EXIT_FAILURE);
}
char Buffer[MAX], oJson[MAX], c;
char* seBuffer;
int nbOJ = 0, toAllocate = 0;
while((c = fgetc(pF)) != EOF)
if(c == '{')
nbOJ++;
Size = nbOJ;
rewind(pF);
char** ObjectsJson = (char**)malloc(nbOJ*sizeof(char*));
nbOJ = -1;
while(fgets(Buffer, MAX, pF))
{
seBuffer = Purge(Buffer, strlen(Buffer) + 1);
if(seBuffer[0] == '[' || seBuffer[0] == ']')
continue;
if(seBuffer[0] == '{')
{
oJson[0] = 0;
nbOJ++;
continue;
}
if(seBuffer[0] == '}')
{
ObjectsJson[nbOJ] = (char*)malloc((toAllocate+1)*sizeof(char));
strcpy(ObjectsJson[nbOJ], oJson);
toAllocate = 0;
continue;
}
toAllocate += strlen(seBuffer);
sprintf(oJson, "%s%s", oJson, seBuffer);
}
free(seBuffer);
fclose(pF);
return ObjectsJson;
}
【问题讨论】:
-
这个问题令人困惑。所以你对代码进行了基准测试,函数调用是程序中最慢的部分?
-
如果代码已经生效,您也可以在Code Review 上提问(提问前请阅读帮助中心)
-
如果
Purge在每个 调用中执行malloc,你就是泄漏 内存。那是因为您只在循环结束后执行 singlefree(seBuffer)after 。您需要在 each 循环迭代中执行一次,对应于来自Purge的每个分配 -
(顺便说一句,你没有包含minimal reproducible example。
Purge函数是从哪里来的?) -
@BeyondCrisp 我不明白你的意思。每次通过循环 fgets 从文件中读取一行。 Purge 采用这一行并完成它的工作。 Purge 在任何时候都不会处理它从之前的循环迭代中处理过的东西,因为每次调用它时,文件中都会有一个新行。那么它怎么能检查它之前检查的东西呢?