我想创建一个接收多个输入的队列,直到它们检测到“完成”然后停止。
所以它的输入是:
Pea 1
Pork 2
Cheese 4
done
然后它返回菜单。继承我的代码。问题是我得到错误“运行时检查失败#3 - 变量'myJob'正在被使用而没有被初始化。”知道为什么会这样吗?谢谢!
void multqueue(struct pqueue *pq, struct job myJob) {
struct job temp;
int i, j;
printf("Enter a name and save its priority: \n");
scanf("%s", &myJob.name);
if (strcmp (myJob.name , "done") == 1){
return;}
scanf("%d", &myJob.priority);
if (pq->front == -1) {
pq->front = 0;
}
pq->end++;
pq->node[pq->end] = myJob;
for (i = pq->front; i < pq->end; i++) {
for (j = i + 1; j <= pq->end; j++) {
// Prioritising the queue nodes by comparing priority
if (pq->node[i].priority > pq->node[j].priority) {
temp = pq->node[i];
pq->node[i] = pq->node[j];
pq->node[j] = temp;
} else if (pq->node[i].priority ==
pq->node[j].priority) {
}
}
}
return;
}
答案 0 :(得分:1)
您没有向我们展示数据结构,但这两行是自我不一致的:
scanf("%s", &myJob.name);
if (strcmp(myJob.name, "done") == 1)
如果strcmp()
来电正确,那么您应该只将myJob.name
传递给scanf()
。您不要将&
放在字符数组的名称前面。如果作为scanf()
传递给&myJob.name
的参数是正确的,那么您应该阅读单个字符(%c
)。
运行时警告消息很有意思;大多数系统都没有提供这种级别的保护。我可以看到它可能会被传递的数组的地址混淆。令人困惑的是&myJob.name
和myJob.name
的类型不同,即使地址的值相同。
您应该测试scanf()
是否成功:
if (scanf("%s", myJob.name) != 1)
...oops — error of some sort...
如果您输入“计算机程序员”,则作业名称将只是“计算机”。
此外,无法保证strcmp()
将返回1.如果字符串相等,则返回0;如果第一个字符串在排序后的第二个字符串之后,则返回未定义的正数;如果第一个字符串在排序后的第二个字符串之前,则返回未定义的负数。因此,有效的比较是:
if (strcmp(myJob.name, "done") == 0) // name == done
if (strcmp(myJob.name, "done") != 0) // name != done
if (strcmp(myJob.name, "done") >= 0) // name >= done
if (strcmp(myJob.name, "done") <= 0) // name <= done
if (strcmp(myJob.name, "done") > 0) // name > done
if (strcmp(myJob.name, "done") < 0) // name < done