我编写了我的第一个 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/