C-我不知道';我不想分配我不会使用的内存!(新问题)
我已经完成了我的第一个C程序。它去除了C注释('/')。我将一个字符串传递给函数strip_comments,创建一个与参数字符串大小相同的新字符串,然后逐字符复制,忽略注释 代码如下: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
#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