#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main(int argc,char **argv)
{
FILE *fp;
char lineBuf[100],**p=NULL,temp[100];
int cnt,j,i;
if(argc!=2)
{
puts("ERROR:Invalid no.of arguments");
return;
}
fp=fopen(argv[1],"r");
if(fp==NULL)
{
printf("'%s' file doesn't exist\n",argv[1]);
}
cnt=0;
while(fgets(lineBuf,100,fp)) //...........loop1
{
cnt++;
p=realloc(p,sizeof(char*)*(cnt));
if(p==NULL)
{
puts("memory unavailable");
return;
}
p[cnt-1]=calloc(1,strlen(lineBuf));
strcpy(p[cnt-1],lineBuf); //................statement1
}
fclose(fp);
for(i=0;i<cnt;i++)
{
for(j=i+1;j<cnt;j++)
{
if(strcmp(p[i],p[j])>0)
{
strcpy(temp,p[i]);
strcpy(p[i],p[j]);
strcpy(p[j],temp);
}
}
}
fp=fopen(argv[1],"w");
for(i=0;i<cnt;i++)
fputs(p[i],fp);
fclose(fp);
puts("sorting done");
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main(int argc,char **argv)
{
FILE *fp;
char lineBuf[100],**p=NULL,temp[100];
int cnt,j,i;
if(argc!=2)
{
puts("ERROR:Invalid no.of arguments");
return;
}
fp=fopen(argv[1],"r");
if(fp==NULL)
{
printf("'%s' file doesn't exist\n",argv[1]);
}
cnt=0;
while(fgets(lineBuf,100,fp)) //........loop2
{
cnt++;
p=realloc(p,sizeof(char*)*(cnt));
if(p==NULL)
{
puts("memory unavailable");
return;
}
p[cnt-1]=calloc(1,strlen(lineBuf));
}
rewind(fp);
for(i=0;fgets(lineBuf,100,fp);i++) //........loop3
{
strcpy(p[i],lineBuf);//..........statement1
}
fclose(fp);
for(i=0;i<cnt;i++)
{
for(j=i+1;j<cnt;j++)
{
if(strcmp(p[i],p[j])>0)
{
strcpy(temp,p[i]);
strcpy(p[i],p[j]);
strcpy(p[j],temp);
}
}
}
fp=fopen(argv[1],"w");
for(i=0;i<cnt;i++)
fputs(p[i],fp);
fclose(fp);
puts("sorting done");
}
我编写了用于对文件中的行进行排序的代码。我已将每行文件复制到动态分配的内存中。在循环1 中,如果我写语句1 ,我会遇到分段错误或内存不可用。所以我修改并编写了 CODE2 。我在这里正确输出。
我想知道, loop1 中发生了什么。
我从文件中获取数据并在同一循环中复制动态分配的内存。同时进行分配和复制是错误的吗?
答案 0 :(得分:7)
strcpy(p[i],lineBuf);
i
永远不会在第一个代码段中初始化
答案 1 :(得分:4)
我认为calloc(1, strlen(lineBuf))
必须是calloc(1, 1 + strlen(lineBuf))
,因为您没有考虑终止null
字节'\0'
答案 2 :(得分:2)
fp=fopen(argv[1],"r");
if(fp==NULL)
{
printf("'%s' file doesn't exist\n",argv[1]);
}
cnt=0;
while(fgets(lineBuf,100,fp)) //........loop2
您检查fp
是否为NULL
,然后继续使用它。