0

これは、stackoverflow に関する私の最初の投稿です。規則に違反したり、再投稿したりしていないことを願っています。私は自分の警告に対する答えを探しました。ある種の同様のインスタンスを見つけることはできますが、有効な修正を得ることができません。私は助けを得ることを望んでいます。

hashfunction(myname) とのハッシュ衝突を見つける必要があります。そこで、いくつかの調査を行い、可能なすべての文字列を指定された長さにテストし、見つかったときに文字列を出力するこの再帰関数をまとめました。見てください。

void findCollision(char prefix[], int max_length);

int main() {
    printf("Finding collison\n");
    char blank[0] = {'a'};
    findCollision(blank,999);
    printf("Press Enter to Continue");
    while( getchar() != '\n' );
    return 0;
}

void findCollision(char prefix[], int max_length){
    char c;
    char temp[sizeof(prefix)+1];
    for(c = 'a'; c <= 'z'; c++){
        strcpy(temp, prefix);
        strcat(temp, c);
        if(hashFunction(temp) == -408228925 && temp != 'myname'){
            printf("found it! --->");
            printf("%s", temp);
        }
    }
    for(c = 'a'; c <= 'z'; c++){
        strcpy(temp, prefix);
        strcat(temp, c);
        if(sizeof(prefix) < max_length){
            findCollision(temp, max_length);
        }
    }
}  

ハッシュ コードを使用してコンパイルすると (必要に応じて提供することもできます)、これらのエラーが発生します。

----------Build Started--------
----------Building project:[ hash - Debug ]----------
/home/mustbelucky/hash/hash.c
22:2: warning: excess elements in array initializer [enabled by default]
22:2: warning: (near initialization for ‘blank’) [enabled by default]
34:3: warning: passing argument 2 of ‘strcat’ makes pointer from integer without a cast [enabled by default]
/usr/include/string.h
136:14: note: expected ‘const char * __restrict__’ but argument is of type ‘char’
/home/mustbelucky/hash/hash.c
35:50: warning: character constant too long for its type [enabled by default]
35:47: warning: comparison between pointer and integer [enabled by default]    
42:3: warning: passing argument 2 of ‘strcat’ makes pointer from integer without a cast [enabled by default]   
/usr/include/string.h
136:14: note: expected ‘const char * __restrict__’ but argument is of type ‘char’

----------Build Ended----------

私はそれらをグーグルで検索しましたが、成功した修正を見つけることに成功しませんでした. 何かご意見は?このプロジェクトは 2 日後に締め切られ、しばらく実行する必要があると感じています。

4

2 に答える 2

2

char blank[0] = {'a'};

文字の長さがゼロの配列を宣言しますが、長さ1のarayで埋めます

strcat(temp, c);

char[]であるtempをcharであるcにcatしようとします。両方の引数はchar*またはchar[]である必要があります

あなたが提供したコードセグメント以外にも報告されたエラーがあると思います。

編集:

temp != 'myname'

temp一致するかどうかをテストしようとしているようです'myname''myname'、文字literealです(これがコンパイルされても、おそらく'm'であり、tempがchar []である場合は、次を使用します。strcmp(temp, "myname") != 0

于 2012-11-30T17:27:18.730 に答える
0

ここでの警告は、実際にはかなり自明です。

22:2: warning: excess elements in array initializer [enabled by default]

これは、作成したスペースよりも多くの要素を配列に入れていることを意味します。

34:3: warning: passing argument 2 of ‘strcat’ makes pointer from integer without a cast [enabled by default]

これは、2 番目の引数はポインターである必要があることを意味しますが、char/int を指定しています。

他の警告は、他のコードからのもののようです。

segfault の少なくとも 1 つの理由は、sizeofここで必要なことを実行できないためです。

于 2012-11-30T17:29:57.250 に答える