0

これが私のコードです:

#define MAX_SET_LENGTH 255
typedef struct{
    char name;
    char *elemetns;
}Set;

void createSet();
int getString();
void filter(char raw[],int *length);
void menu();
void del_duplicate(char *s,int n);
void displyAllSets();


Set sets[26];
int setCount=0;

int main(){
    menu();
}


void menu(){
    int input;
    do{
        printf("\n1.Create Set.\n");
        printf("2.display all Sets.\n");
        printf("0.Exit.\n");
        scanf("%d",&input);

        switch(input){
        case 0:
            break;
        case 1:
            createSet();
            break;
        case 2:
            displyAllSets();
            break;
        default:
            printf("Error input,please input again\n");

        }
    }while (input!=0);
}


void displyAllSets(){
    int i;
    for(i=0; i<setCount; i++) {
        printf("\n%c->{%s}\n",sets[i].name,sets[i].elemetns);
    }
}


void createSet(){
    if(setCount<26){
        printf("Please input the set's elements:\n");
        char elements[MAX_SET_LENGTH];
        int s_length = getString(elements,MAX_SET_LENGTH);
        filter(elements,&s_length);
        del_duplicate(elements,s_length);
        if(s_length > 0){    
            elements[s_length]='\0';
            Set set;
            set.elemetns = elements;
            set.name = 'a'+ setCount;
            sets[setCount++]=set;

            displyAllSets();
        }else{
            printf("No illegal input!\n");
        }
    }else{
        printf("It's limit to 26");
    }

}


int getString(char s[],int max_length){
    char c;
    int i=0;
    getchar();
    while((c=getchar())!='\n')
    s[i++]=c;
    return (i>=max_length ? max_length : i);
}

void filter(char raw[],int *length){
    char string[*length];
    int i=0,j=0;
    int deletedCount=0;
    for(;i<*length;i++){
        string[i]=raw[i];
    }
    for(i=0;i<*length;i++){
        if(string[i]>='A' && string[i]<='Z'){
            raw[j++]=string[i];
        }else{
            deletedCount++;
        }
    }
    *length-=deletedCount;
    raw[j]='\0';
}


void del_duplicate(char raw[],int length){
    int i=0,j;
    for(;i<length && length>0;i++){
            for(j=i+1;j<length;){
                if(raw[i]==raw[j]){
                    int delFrom=j;
                    while(delFrom<length){
                        raw[delFrom]=raw[delFrom+1];
                        delFrom++;
                    }
                    j=i+1;
                    length--;
                }else{
                    j++;
                }
            }   
    }
}

セット作成時 電話をかけるとすべてがうまく見えますcreateSet();

ただし、do-while ブロックで呼び出した後printf("\n1.Create Set.\n")、配列setsが変更されています。誰でも助けることができますか?

今すぐデバッグ

F6を押した後 ここに画像の説明を入力

左下のウィンドウsets[0].elementsが変わっているのがわかりますか?何が起こっているのですか?

4

1 に答える 1

0

この行にローカル変数のアドレスを保存しています:

set.elemetns = elements;

それは未定義の動作です。それをしないでください!

文字列をコピーする場合は、次のいずれかを実行します。

  1. 構造体を変更して char 配列を格納しstrncpy、文字列のコピーに使用します。また
  2. 文字列を複製します (後で解放することを忘れないでください):set.elemetns = strdup(elements);

完全に別の問題で、getString大まかに何をしているように見える関数を実装しましたfgetsfgets代わりに使用する必要があります。

于 2013-10-21T01:33:14.050 に答える