从控制台读取值会覆盖结构

时间:2013-08-21 13:06:45

标签: c string user-input

我制作了一个小程序,我有一个结构,并根据控制台的值填充其参数。

#define M 3
struct data {
    char* info;
    int key;
};

void initHash(data* d) {
    int i;
    for(i=0; i<M; i++) {
        d[i].info = " ";
        d[i].key = -1;
    }
}


void printList(data* d) {
    int i;
    for(i=0; i< M; i++) {
        if(strcmp(d[i].info, " ")) {
            printf(" %d %d %s \n", i, d[i].key, d[i].info);
        }
    }
}

int linearProbing() {
    struct data d[M];
    int hashval;
    char* info;
    char str[25];


    initHash(d);
    scanf("%s",&str);
    while(strcmp(str, "end") != 0) {
    d[id].info = str;
    **printf("before reading \n");
    printList(d);
    id++;
    scanf("%s",&str);
    printf("after reading \n");
    printList(d);
    printf("next iter \n");**
    }
    printList(d);
    return true;
}

我的问题是突出显示的行,第一个打印函数打印正确的值,但在获得输入后,data.info参数更改为struct array的所有M成员的新输入值。有人可以解释为什么会这样吗?

示例输出:

statue
before reading 
 0 -1 statue 
tornado
after reading 
 0 -1 tornado 
next iter 
before reading 
 0 -1 tornado 
 1 -1 tornado 
clown
after reading 
 0 -1 clown 
 1 -1 clown 
next iter 
before reading 
 0 -1 clown 
 1 -1 clown 
 2 -1 clown

2 个答案:

答案 0 :(得分:4)

您没有将输入字符串复制到每个d[id].info成员 - 您正在设置指向相同字符缓冲区(str)的指针,您一次又一次地使用和覆盖。

即,d[0].infod[1].info等都指向同一个记忆。

您可能想说:

d[id].info = strdup(str);

每次指向字符串的新副本。

答案 1 :(得分:2)

您正在将info变量指向字符串文字。为了存储字符串,您应该首先分配足够的存储空间,如:

info = (char *) malloc(string size * sizeof(char))

然后使用string size

复制字符串