0

より大きなプログラムの一部としてファイルから文字列を抽出する関数を作成する際に問題が発生しています。memset または bzero を使用して、使用している文字配列を消去する場合を除いて、すべて正常に動作しているようです。私はこの問題を 1 時間以上抱えていますが、何をしてもセグ フォールトが発生し続けます。bzero と memset の両方でこのエラーが発生します。私を助けてください。以下にコードを添付します。「Come out of addfront」ステートメントは印刷されますが、「Done with all bzero」ステートメントは印刷されません。その時点でセグメンテーション違反が発生します。ありがとうございました

void extractFileData(FILE *fp , char clientName[])
{
    char tempFileName[50], tempFilePath[100], tempFileSize[50];
    struct stat fileDetails;

    while(fgets(tempFileName, sizeof(tempFileName), fp)!= NULL)
    {
        if((newLinePos = strchr(tempFileName, '\n')) != NULL)
        {
            *newLinePos = '\0';
        }

        strcat(tempFilePath, "SharedFiles/");
        strcat(tempFilePath, tempFileName);

        if(stat(tempFilePath, &fileDetails) < 0)
        {
            perror("Stat error");
            exit(1);
        }

        //Copy it into a string
        sprintf(tempFileSize, "%zu", fileDetails.st_size);
        printf("temp file size: %s\n", tempFileSize);

        //Add all these details to the file list by creating a new node
        addFront(tempFileName, tempFileSize, clientName);

        printf("Come out of addfront\n");

        memset(&tempFileName, 0, 45);
        printf("Done with all bzero\n");
        memset(&tempFileSize, 0, sizeof(tempFileSize));
        memset(&tempFilePath, 0, sizeof(tempFilePath));

        printf("Done with all bzero\n");
    }
}   

編集:

void addFront(char fileName[], char fileSize[], char clientName[])
{
    FILENODE* n;
    printf("Inside add front function\n");
    strcpy(n->fileName, fileName);
    printf("n->filename: %s\n", n->fileName);
    strcpy(n->fileSize, fileSize);
    printf("n->filesize: %s\n", n->fileSize);
    strcpy(n->ownerName, clientName);
    printf("n->ownername: %s\n", n->ownerName);
    myFileList.head = n;
    printf("Did it go past myfilelist head = n\n");
    myFileList.numOfNodes++;
    printf("num of nodes: %d\n", myFileList.numOfNodes);
}

addFront 関数のコードを追加しました。myFileList基本的には、基本的にリンクされたリストの実装である構造体に詳細を追加します。は、リスト内のFILENODE各エントリを表します。

編集:

使用している構造体を追加する

 struct fileNode
 {
      char fileName[50];
      char fileSize[50];
          char ownerName[25];
      struct fileNode* next;
 };

 struct fileList
 {
      struct fileNode* head;
      struct fileNode* tail;
       int numOfNodes;
 };

 typedef struct fileList FILELIST;
 typedef struct fileNode FILENODE;
4

2 に答える 2

1

なぜあなたのプログラムがそこでクラッシュするのか分かりません。しかし、プログラムで別のエラーが発生する可能性があります。最初に他のエラーを修正し、まだ問題があるかどうかを確認します。

これは間違っています:

strcat(tempFilePath, "SharedFiles/");
strcat(tempFilePath, tempFileName);

tempFilePath変数は初期化されていません。これは偶然にクラッシュしないかもしれませんが、クラッシュしないことを信頼することはできません。スタックに落書きする可能性があります。

代わりにこれを行ってください:

snprintf(tempFilePath, sizeof(tempFilePath), "SharedFiles/%s", tempFileName);

最後に、配列をゼロにする必要はありません。配列の内容は次のループ反復では使用されないため、無視することをお勧めします。

void extractFileData(FILE *fp , char clientName[])
{
    char tempFileName[50], tempFilePath[100], *newLinePos;
    struct stat fileDetails;
    while (fgets(tempFileName, sizeof(tempFileName), fp)) {
        if ((newLinePos = strchr(tempFileName, '\n')))
            *newLinePos = '\0';
        snprintf(tempFilePath, sizeof(tempFilePath),
                 "SharedFiles/%s", tempFileName);
        if (stat(tempFilePath, &fileDetails) < 0) {
            perror("Stat error");
            exit(1);
        }
        printf("temp file size: %zu\n", tempFileSize);
        addFront(tempFileName, tempFileSize, clientName);
    }
}   

このsnprintf()関数は、Cでこのような作業を行うための一番の選択肢です。snprintf()「明らかにクラッシュしない」コードとは対照的に、「明らかにクラッシュしない」コードを書くのは簡単です。

それでもコードがクラッシュする場合は、別の場所でエラーが発生しています。

于 2012-11-26T00:58:52.500 に答える
0

addFront()n = malloc( sizeof *n)何かを行う前に が必要です。

于 2012-11-26T01:17:15.713 に答える