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();

但是,在调用printf("\n1.Create Set.\n")do-while 块后,数组sets已被修改。任何人都可以帮忙吗?

现在调试

按 F6 后 在此处输入图像描述

你能看到左下角的窗口,sets[0].elements被改变了,发生了什么吗?

4

1 回答 1

0

您将在此行上存储局部变量的地址:

set.elemetns = elements;

那是未定义的行为。不要这样做!

如果要复制字符串,请执行以下操作之一:

  1. 改变结构存储一个char数组,strncpy用来复制字符串;或者
  2. 复制字符串(记得稍后释放它):set.elemetns = strdup(elements);

在一个完全独立的问题中,您已经实现了一个getString似乎大致做了什么的fgets函数。你应该fgets改用。

于 2013-10-21T01:33:14.050 回答