我正在尝试使用动态内存分配从文件中删除多余的空格和换行符,但出现内存段错误。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
FILE*fp;
char ch;
char *p;
int i=0,size;
if((fp = fopen(argv[1],"r"))==NULL)
{
printf("Couldnt open file\n");
return;
}
fseek(fp,0,2);
size=ftell(fp);
p = calloc(1,size+1);
rewind(fp);
while((p[i] = fgetc(fp))!=EOF)
{
i++;
}
p[i]=EOF;
fclose(fp);
for ( i=0; p[i]!=EOF; i++)
{
if (p[i] == ' ' && p[i+1] == ' ')
{
memmove(p+i,p+i+1,strlen(p+i+1));
i--;
}
if (p[i] == '\n' && p[i+1] == '\n')
{
memmove(p+i,p+i+1,strlen(p+i+1));
i--;
}
} //all extra spaces and newlines deleted..
fp = fopen("modified","w");
if (fp==NULL)
{
printf("coudlnt create\n");
return;
}
i=0;
while((fputc(p[i],fp))!=EOF)
{
i++;
}
fclose(fp);
}
我在上面的程序中遇到段错误(核心转储),如果我用 strlen(p+i+2) 修改 memmove 指令,那么它不会给出段错误,但会陷入某种无限循环。请告诉我我哪里出错了。
最佳答案
你的文件读取被破坏了; EOF
不是字符,因此您无法将字符与它进行比较并获得正确的结果。
改为使用 fread()
读取整个文件。请注意,它可能会返回更短的长度,并且无论如何都需要循环。
同时停止使用strlen()
;您知道分配缓冲区和读入文件时的长度,因此就性能而言,像您一样一直使用strlen()
是非常浪费的。
关于c - C中文件操作中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21990445/