0

私の学校の課題では、ブルートフォースアルゴリズムを使用して文字列を見つける必要があります。

長さがたとえば3の場合、これらはすべて可能な組み合わせです。a b c aa ba ca ab bb cb ac bc cc aaa baa caa aba bba cba aca bca cca aab bab cab abb bbb cbb acb bcb ccb aac bac cac abc bbc cbc acc bcc ccc

で問題が発生しましたstrcat

これがコードです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
# define PASS_SIZE 3


char letters[] = "abc";
char test[] = "acb";
int count = 0;
int nbletters = sizeof(letters)-1;
int bruteForce(int size);

int main() {
    int i = 0;
    int notFound = 1;

    for (i = 1; i <= PASS_SIZE && notFound == 1; i++){
        notFound = bruteForce(i);
    };

    printf("Count: %d\n",count);

    return -1;
}

int bruteForce(int size){
    int i;
    int entry[size];
    char pass[50];
    char *temp;

    for(i=0 ; i<size ; i++){
        entry[i] = 0;
    }
    do {
        for(i=0 ; i<size ; i++){
            temp = letters[entry[i]];
            printf("%c", temp);
            strcat(pass,temp); /*Getting error here*/
       }

        count++;
        printf("\n");

        /*Compare pass with test*/
        if (strcmp (pass,test) == 0){
            return 0;
        };

       for(i=0 ; i<size && ++entry[i] == nbletters; i++){
            entry[i] = 0;
        }

    } while(i<size);

    return 1;
}

おそらく、ブルートフォースアルゴリズムは最良のアルゴリズムではありません。

strcatが機能せず、セグメンテーションが失敗するのはなぜですか?

4

2 に答える 2

2

pass変数を宣言していますが、初期化していない。あなたがその終わりに連結するとき、あなたは最初にその終わりがその始まりであると仮定しています、しかしあなたはそれを事実にする必要があります。

tempさらに重要なのは、変数を見てください。あなたはそれをとして宣言しましたが、それを(文字を指す代わりに)としてchar *初期化し、それからあなたはそれを再びポインタのように扱います-しかしそれは有効な場所を指していません(あなたのクラッシュを引き起こします) 。charstrcat()

于 2012-10-08T15:24:12.480 に答える
1

strcatnullで終了する文字列を期待していますが、char pass[50]初期化されていません。pass[0] = '\0'有効なC文字列を取得するように設定します。

于 2012-10-08T15:23:33.523 に答える