2

この関数は、ファイルのポインタとしてパラメータを取得し、すべてのファイルを に入れ、struct anagram別のファイルに書き込むことになっています。現在、各データにはそれらの間に多くのスペースがあります。テストファイルを作成してテストするため、charCompare は正常に動作しています。

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include "anagrams.h"
#define SIZE 80

//struct
struct anagram {
char word[SIZE];
char sorted[SIZE];
};

void buildDB ( const char *const dbFilename ){

    FILE *dict, *anagramsFile;
    struct anagram a;

    //check if dict and anagram.data are open
    errno=0;
    dict= fopen(dbFilename, "r");

    if(errno!=0) {
        perror(dbFilename);
        exit(1);
    }

    errno=0;

    anagramsFile = fopen(anagramDB,"wb");

    char word[SIZE];
    char *pos;
    int i=0;

    while(fgets(word, SIZE, dict) !=NULL){

        //get ripe of the '\n'
        pos=strchr(word, '\n');
        *pos = '\0';

        //lowercase word
        int j=0;
        while (word[j]){
            tolower(word[j]);
            j++;
        }

        /* sort array using qsort functions */ 
        qsort(word,strlen(word), sizeof(char), charCompare);

        strncpy(a.sorted,word,sizeof(word));

        fwrite(&a,1,sizeof(struct word),anagramsFile);

        i++;
    }
    fclose(dict);
    fclose(anagramsFile);

}

データ: 10 番目 1 番目 2 番目

4

1 に答える 1

3

考えられる原因は、に渡されたサイズ引数qsort()です。リンクされたリファレンスページからqsort()

size-配列内の各要素のサイズ(バイト単位)

したがって、サイズ引数はである必要があります1。これは、であることが保証されており、またはである可能性は高くsizeof(char)ありません。投稿されたコードは、実際の配列よりも(または)倍大きい配列を指していることを誤って通知し、想定されていないメモリにアクセスします。への変更:sizeof(char*)48qsort()word48qsort()

qsort(word,strlen(word), 1, charCompare);

もう1つの考えられる原因は、次の行によって引き起こされるバッファオーバーランです。

strncpy(&a.sorted[i],word,sizeof(word));

iwhileループが繰り返されるたびにインクリメントされますが、sizeof(word)常に書き込まれます。SIZEとの値はBUFSIZ投稿されませんが、それらが等しい場合でも、最初の反復後にstrncpy()の範囲を超えて書き込みます。a.sorted

その他のポイント:

  • fgets()は改行文字の読み取りが保証されていないため、strchr()逆参照する前にの戻り値を確認してください。
  • tolower()小文字を返しますが、引数は変更されません。
  • なぜ一時バッファ()に読み込んwordでコピーするのですか?structメンバーに直接読んでください。
于 2012-11-20T08:25:37.463 に答える