gpt4 book ai didi

C - 我不想分配我不会使用的内存! (新问题)

转载 作者:太空宇宙 更新时间:2023-11-04 07:38:55 25 4
gpt4 key购买 nike

我编写了我的第一个 C 程序。它去除 C 注释 ('//')。我将一个字符串传递给函数 strip_comments,创建一个与参数字符串大小相同的新字符串,然后我逐个复制一个字符,忽略注释。

这是代码:

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

#define IN 1
#define OUT 0

int file_size(FILE *file);
char * strip_comments(char *content);

int main(int argc, char *argv[])
{
FILE *file;
char *buffer, *content;
int size;

if (argc == 1)
{
printf("USAGE: stripccomments filename\n");
return 1;
}

if ((file = fopen(argv[1], "rw")) == NULL)
{
printf("Could not open file '%s'.\n", argv[1]);
return 1;
}

size = file_size(file);
buffer = malloc(sizeof(char) * size);

if (buffer == NULL)
{
printf("Could not allocate memory\n");
return 1;
}

fread(buffer, sizeof(char), size, file);

content = strip_comments(buffer);
printf("%s", content);

free(buffer);
fclose(file);

return 0;
}

int file_size(FILE *file)
{
int size;

fseek(file, 0, SEEK_END);
size = ftell(file);
rewind(file);

return size;
}

char * strip_comments(char *content)
{
int state, length, i, j;
char *new_content;

state = OUT;
length = strlen(content);
new_content = malloc(sizeof(char) * length);
j = 0;

for (i = 0; i < length; i++)
{
if (content[i] == '/' && content[i + 1] == '/')
{
state = IN;
i++;
continue;
}

if (state && content[i] == '\n')
{
state = OUT;
}

if (!state)
{
new_content[j] = content[i];
j++;
}
}
new_content[j + 1] = '\0';

return new_content;
}

如果有一些评论,我将只使用分配的字符串的一些字节。我不想分配超过我将使用的。执行此操作并返回新字符串的最佳方法是什么?或者我应该修改作为参数传递的字符串?

更新:这个未使用的空间会怎样?它是否仍处于“边缘地带”?当执行结束时,这个空间会发生什么?

谢谢。

最佳答案

如前所述,这并不能解决您的问题,但我的方法是将其编写为一个函数,它与输入文件句柄和输出文件句柄一起工作,即 void strip_comments(FILE *infile, FILE *outfile );。无论如何,您实际上只是一次进行一个字符的解析,所以从 content[i++] 切换到 getc() 会有什么损失?如果您使用文件句柄而不是字符串来执行此操作,您 a) 不必在内存中存储可能很大的整个文件,并且 b) 不必担心为缓冲区分配内存。

就是说,如果你想用 char *s 代替,你总是可以解析字符串两次:一次计算要分配的字节数,然后一次复制所述字节.或者您可以在最后简单地调用 realloc 以将您的缓冲区缩短到适当的大小。

关于C - 我不想分配我不会使用的内存! (新问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6064309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com