printf可以更改其中一个数组参数吗?

时间:2013-10-21 01:27:43

标签: c printf

这是我的代码:

#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++;
                }
            }   
    }
}

when create Set 在致电createSet();

时,一切看起来都不错

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

debug now

按下F6后

enter image description here

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

1 个答案:

答案 0 :(得分:0)

您正在此行存储本地变量的地址:

set.elemetns = elements;

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

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

  1. 更改结构以存储char数组,并使用strncpy复制字符串;或
  2. 复制字符串(并记得稍后将其释放):set.elemetns = strdup(elements);
  3. 在一个完全独立的问题中,您实现了一个函数getString,它似乎与fgets大致相同。您应该使用fgets代替。