使用的变量未经初始化(排队)

时间:2013-11-16 14:34:28

标签: c queue jobs

我想创建一个接收多个输入的队列,直到它们检测到“完成”然后停止。

所以它的输入是:

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

1 个答案:

答案 0 :(得分:1)

您没有向我们展示数据结构,但这两行是自我不一致的:

scanf("%s", &myJob.name);
if (strcmp(myJob.name, "done") == 1)

如果strcmp()来电正确,那么您应该只将myJob.name传递给scanf()。您不要将&放在字符数组的名称前面。如果作为scanf()传递给&myJob.name的参数是正确的,那么您应该阅读单个字符(%c)。

运行时警告消息很有意思;大多数系统都没有提供这种级别的保护。我可以看到它可能会被传递的数组的地址混淆。令人困惑的是&myJob.namemyJob.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