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

标签 c string comments malloc

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

相关文章:

javascript - Javascript 中的通配符字符串比较

xml - 使用 xpath 从 tomcat 的 server.xml 中删除注释部分

asp.net - ASP 生成 JavaScript

C 应用程序在 strcat 上失败

c - C 中带有 malloc 的子字符串函数返回不正确的值

c - 从 Debian 上运行的 C 程序查看 TCP header 字段

c - double free or corruption (!prev) 我不知道为什么在 C 中

.net - 字符串类型是存储在堆上还是堆栈上?

php - 在 PHP 中执行字符串连接的最佳方法是什么?

xml - Delphi 2010 中的 C# 样式 XML 注释