使用SCANF在循环中创建新变量

时间:2014-03-27 02:49:16

标签: c heap priority-queue

我正在尝试收集C中优先级队列的用户数据。当我有一个循环执行多个scanf来收集输入时。我的问题是,当我最终从队列中弹出我的值时。所有项目都是相同的值。这是我的榜样:

queue_t *q = create();

//The count is just a temporary solution to a break condition.
//Just used for testing

int count = 0;
while(1){

    printf("\nPlease Enter A Task: \n");
    char* a;
    scanf("%s", &a);

    printf("\nPlease give your task a priority ranking between 0-(less important) and 10-(most important) : \n");
    int rank;
    scanf("%d", &rank);

    item_t item;
    item.value = &a;
    item.rank = rank;

    insert(q, item);
     count++;

     if(count == 5)
        break;
}

所以这循环5次。如果我输入:test1,test2,test3,test4,test5。当它最终在后面的代码中弹出并打印时,它会打印:test5 test5 test5 test5 test5

如何有效地使用循环来收集输入而不覆盖先前输入的地址? (如果那就是问题所在)

我的结构是:

typedef struct i {
void *value;
float rank;
} item_t;

2 个答案:

答案 0 :(得分:1)

要解决您的问题,应分配item.value然后写入

while(1) {

    printf("\nPlease Enter A Task: \n");
    item_t item;
    item.value = (char *)malloc(100);
    // scanf("%s", item.value);
    fgets(item.value, sizeof (item.value), stdin);

    printf("\nPlease give your task a priority ranking between 0 -(less important) and 10-(most important) : \n");
    scanf("%f", &item.rank);

    insert(q, item);
    count++;

     if(count == 5)
        break;
}

答案 1 :(得分:0)

如果使用char *a,则必须为其分配内存。否则,如果输入是单个字符,请使用char a

您还必须将a中的值复制到item.value。在复制之前,item.value应该分配内存。