我正在尝试收集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;
答案 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
应该分配内存。