Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-我不知道';我不想分配我不会使用的内存!(新问题)_C_String_Comments_Malloc - Fatal编程技术网

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

C-我不知道';我不想分配我不会使用的内存!(新问题),c,string,comments,malloc,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(c

我已经完成了我的第一个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;
}
#包括
#包括
#包括
#在1中定义
#定义出0
整数文件大小(文件*文件);
字符*条带注释(字符*内容);
int main(int argc,char*argv[])
{
文件*文件;
字符*缓冲区,*内容;
整数大小;
如果(argc==1)
{
printf(“用法:stripcomments文件名\n”);
返回1;
}
if((file=fopen(argv[1],“rw”))==NULL)
{
printf(“无法打开文件“%s”。\n”,argv[1]);
返回1;
}
大小=文件大小(文件);
缓冲区=malloc(sizeof(char)*大小);
if(buffer==NULL)
{
printf(“无法分配内存\n”);
返回1;
}
fread(缓冲区、大小、文件);
内容=条带注释(缓冲区);
printf(“%s”,内容);
自由(缓冲);
fclose(文件);
返回0;
}
整数文件大小(文件*文件)
{
整数大小;
fseek(文件,0,SEEK_END);
大小=ftell(文件);
倒带(文件);
返回大小;
}
字符*条带注释(字符*内容)
{
int状态,长度,i,j;
char*新内容;
状态=输出;
长度=strlen(内容);
新内容=malloc(sizeof(char)*长度);
j=0;
对于(i=0;i
如果有一些注释,我将只使用分配字符串的一些字节。我不想分配超过我将使用的资源。执行此操作并返回新字符串的最佳方法是什么?还是应该修改作为参数传递的字符串

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


谢谢。

这并不能像前面所说的那样解决您的问题,但我的方法是将其作为一个函数来编写,该函数与输入文件句柄和输出文件句柄一起工作,即
void strip_comments(file*infile,file*outfile)。不管怎么说,您实际上只是在一次解析一个字符,那么从
content[i++]
切换到
getc()
有什么损失呢?如果使用文件句柄而不是字符串,则a)不必在内存中存储可能较大的整个文件,b)不必担心为缓冲区分配内存


也就是说,如果您想使用
char*
s来执行此操作,您可以始终对字符串进行两次解析:一次用于计算要分配的字节数,然后一次用于复制所述字节。或者,您可以在最后简单地调用
realloc
,将缓冲区缩短到适当的大小。

这并不能解决上述问题,但我的方法是将其编写为一个函数,该函数与输入文件句柄和输出文件句柄一起工作,即
无效条带注释(file*infle,file*outfile)。不管怎么说,您实际上只是在一次解析一个字符,那么从
content[i++]
切换到
getc()
有什么损失呢?如果使用文件句柄而不是字符串,则a)不必在内存中存储可能较大的整个文件,b)不必担心为缓冲区分配内存


也就是说,如果您想使用
char*
s来执行此操作,您可以始终对字符串进行两次解析:一次用于计算要分配的字节数,然后一次用于复制所述字节。或者你可以在最后简单地调用
realloc
,将缓冲区缩短到合适的大小。

我只能想出一种方法来提高分配效率(我不认为需要这样做,老实说,你现在所做的似乎很合理,特别是对于一个新的C程序员)

我能想到的是分两次检查你的档案。在第一步中,您可以计算需要分配的内存量。在这之后,您可以精确地分配所需的内存量,然后在第二步中进行实际复制


另外,您可能会受益于使用文件句柄而不是完全在内存中执行此操作,这样您就不需要一次分配大量内存。

我只能想出一种方法来提高分配效率(我并不认为这是必须的,老实说,你现在所做的似乎很合理,特别是对于一个新的C程序员来说)

我能想到的是分两次浏览你的文件。在第一次浏览中,你可以计算你需要分配的内存量。在这之后,你可以精确地分配你需要的内存量,然后在第二次浏览中,你进行实际的复制


另外,您可能会受益于使用文件句柄而不是完全在内存中执行此操作,这样您就不需要一次分配大量内存。

因为您的程序不知道包含源代码需要多少内存,所以您可以从初始缓冲区大小开始,并根据需要增加它。Anot她的方法是首先扫描文件并计算大小的差异。这两种方法都会根据传入的注释量对性能产生影响。多个
malloc
/
realloc
'将降低性能,并将整个文件读取两次,另一方面,您担心浪费时间内存,这是您的选择,或者您可以使用所有3个,设置默认值和
size of 10\0#%^@&
          ^^^garbage
          ^^null char