-3

コード 1:

#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");
}

コード 2:

#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で何が起こっているのか知りたいです。

ファイルからデータをフェッチし、同じループで動的に割り当てられたメモリにコピーしています。割り当てとコピーを同時に行うのは間違っていますか?

4

3 に答える 3

7
strcpy(p[i],lineBuf);

i最初のコード スニペットで初期化されることはありません

于 2014-12-11T15:08:50.340 に答える
4

終了バイトを考慮していないため、 でなければならないcalloc(1, strlen(lineBuf))と思いますcalloc(1, 1 + strlen(lineBuf))null'\0'

于 2014-12-11T15:08:36.343 に答える