1

リスト Lb と La を繰り返し要素なしで結合したいのはサンプル テストです。機能せず、-1073741510 が返されました。おそらく配列のオーバーフローだと思いますが、どこに問題があるのか​​ わかりません

これは私のコードです:

#include <stdio.h>

void Union(char *La, char *Lb);
int ListLength(char *L);
void GetElem(char *L, int i, char *e);
int LocateElem(char *L, char *e, int (*comp)(char a, char b));
int compare(char a, char b);
void ListInsert(char *, int, char *);

int main(){
    char *La;
    char *Lb;
    int i;
    for(i = 0; i <= 10; ++i){
        La[i] = i;
        Lb[i] = i + 5;
    }
    La[i] = '\0';
    Lb[i] = '\0';
    Union(La, Lb);
    for(i = 0; La[i] != '\0'; ++i){
        printf("%c\n", La[i]);
    }
    return 0;
}

//unite La and Lb without repeat elements
void Union(char *La, char *Lb){
    int La_length = ListLength(La);
    int Lb_length = ListLength(Lb);
    int i = 0;
    char *e;
    for(i; i<= Lb_length; ++i){
        GetElem(Lb, i, e);
        if(!LocateElem(La, e, compare))
            ListInsert(La, ++La_length, e);
    }
}

//caculate the length of L
int ListLength(char *L){
    int i;
    for(i = 0; *(L + i) != '\0'; ++i);
    return i;
}

void GetElem(char *L, int i, char *e){
    *e = *(L + i);
}

//search the element e in L, if exist return the location, else return 0
int LocateElem(char *L, char *e, int (*comp)(char a, char b)){
    int i;
    for(i = 0; *(L + i) != '\0'; ++i){
        if(comp(*(L + i), *e)) return i + 1;
    }
    return 0;
}

//compare the element a and b
int compare(char a, char b){
    if(a == b) return 1;
    return 0;
}

//if e doesn't exit in L, insert the e in L
void ListInsert(char *L, int i, char *e){
    int j;
    for(j = ListLength(L) - 1; j >= i; --j){
        *(L + j + 1) = *(L + j);
    }
    L[ListLength(L)] = '\0';
    *(L + i - 2) = *e;
}
4

2 に答える 2

4

まず、これは間違っています:

char *La;
char *Lb;
int i;
for(i = 0; i <= 10; ++i){
    La[i] = i;
    Lb[i] = i + 5;
}

たとえば、次のように宣言して、Laとのメモリを予約する必要があります。Lb

char La[12];
char Lb[12];

次にこれ:

char *e;
for(i; i<= Lb_length; ++i){
    GetElem(Lb, i, e);

読む必要があります:

char e;
for(; i<= Lb_length; ++i){
    GetElem(Lb, i, &e); /* better yet: e=Lb[i] */

最後に、終了条件として<=代わりに使用することで、1 回ループしすぎている可能性があります。<for

于 2013-03-29T17:54:00.200 に答える
0

いくつかの問題があります。生ポインタ、固定長配列、可変長配列、動的配列とは何かについてもっと読む必要があると思います。配列を大きくする必要がある場合は、malloc と realloc を使用して動的にすることができます。または、オーバーフローしないことがわかっている「大きな」配列を使用することもできます。

int La[12]; //  0 to 10, plus '\0'

しかし、これは固定されており、成長できません。あなたが使用することができます

int La[1000]; // if it solve yours problems

しかし、一般的には動的配列が必要になります。

また、配列が保持できるかどうか、0またはターミネータとして使用されるかどうかを決定する必要があります。'\0'0、使用する形式では等しいです。最初の要素が 0 であるため、 for サイクルの多くは実行されません。

于 2013-03-29T18:14:27.087 に答える