0

这是我的代码片段:

printf("\nCommand? ");
ret = scanf("%c", &command);
do
{
    // printf("Command? ");
    // ret = scanf("%c", &command);
    if (ret != 1)
    {
        fprintf(stderr, "Invalid input!\n");
    }

    if (command == 'd')
    {
        result = dequeue(&queue1, &entry);
        if (result == 1)
            printf("%d was dequeued\n", entry);
        else if (result == 0)
            fprintf(stderr, "ERROR: attempt to dequeue from an empty"
                    " queue\n");
    }
    else if (command == 'e')
    {
        ret = scanf("%d", &add);
        result = enqueue(q, add);
    }
    else if (command == 'q')
        break;
    else
        fprintf(stderr, "Invalid command!\n");

    printf("Queue:");
    for (int i = 0; i < q->end; ++i)
    {
        printf("%d", q->element[i]);
    }
    printf("\nCommand? ");
    scanf("%c", &command);
} while (command != 'q');

然后是部分 GDB 日志:

146             printf("Command? ");
(gdb)
147             ret = scanf("%c", &command);
(gdb)
Command? d
148             if (ret != 1)
(gdb)
153             if (command == 'd')
(gdb)
155                 result = dequeue(&queue1, &entry);
(gdb)
156                 if (result == 1)
(gdb)
158                 else if (result == 0)
(gdb)
159                     fprintf(stderr, "ERROR: attempt to dequeue from an empty"
(gdb)
ERROR: attempt to dequeue from an empty queue
172             printf("Queue:");
(gdb)
173             for (int i = 0; i < q->end; ++i)
(gdb)
177             printf("\nCommand? ");
(gdb)
Queue:
178             scanf("%c", &command);
(gdb)
179         } while (command != 'q');
(gdb)

如您所见,第 172 行printf("Queue:");以及其余代码不会被执行。我不知道为什么。

我在命令中输入了 d

有人可以帮我解释一下吗?谢谢。

4

4 回答 4

3

它被执行,正如您在调试器中的代码单步执行中看到的那样。它不会立即打印,因为 printf() 输出保存在缓冲区中,直到缓冲区已满或遇到换行符。如果您需要立即查看输出,请在末尾添加换行符或 fflush(stdout)。

于 2013-10-22T13:40:32.040 回答
3

我认为您担心的printf是在调试器中跟踪但没有产生输出。这可能是因为printf调用将输出发送到stdout通常是缓冲的,所以输出可能要等到稍后在 gdb 中运行时才会出现。在某些系统中,当看到换行符时会刷新缓冲区。因此,您可以尝试添加\n"Queue:". 或者fflush(stdout);在打印之后肯定会导致 printf 工作。输出到stderr没有缓冲。这就是为什么您会立即看到该输出。

于 2013-10-22T13:39:06.610 回答
0

检查您的代码后,我能想出的唯一解决方案是您在 for 循环中的条件q->end是 <= 0

于 2013-10-22T13:45:01.813 回答
0

全部。

我想我已经弄清楚了:只需编写另一个函数来打印出所有结果。

所以修改后的代码是这样的:

do
{
    ret = fgets(buf, BUF_LENGTH, "%c %d", &command, &add);
    if (ret != 1 && ret != 2)
    {
        fprintf(stderr, "Invalid input!\n");
        continue;
    }

    if (command == 'd')
    {
        ...
    }
    else if (command == 'e')
    {
         ...
    }
    else if (command == 'q')
        break;
    else
        fprintf(stderr, "Invalid command!\n");

    /* Printing out the queue elements */
    print_element(q);

    printf("Command? ");
} while (command != 'q');

我知道我的代码很乱,我仍然是 C 编程语言的初学者。我正在学习指点。

代码的“...”部分有一些修改,但我相信这些更改与 I/O 无关。

谢谢大家的建议。

于 2013-10-22T16:56:09.707 回答