以下是我的代码片段:
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:");
将不会被执行,以及其余的代码。我无法弄清楚原因。
我输入了命令
有人可以帮我解释一下吗?感谢。
答案 0 :(得分:3)
我认为您担心的是printf
在调试器中被跟踪但没有产生输出。这可能是因为printf
调用将输出发送到stdout
,这通常是缓冲的,因此直到稍后在gdb中运行时才会出现输出。在某些系统中,当看到换行符时刷新缓冲区。因此,您可以尝试将\n
添加到"Queue:"
的末尾。或者打印后fflush(stdout);
肯定会导致printf工作。输出到stderr
未缓冲。这就是你立即看到输出的原因。
答案 1 :(得分:3)
执行它,正如您在调试器中单步执行代码时所看到的那样。它不会立即打印,因为printf()输出保存在缓冲区中,直到缓冲区已满或遇到换行符。如果你需要立即看到输出,可以在最后添加换行符或者之后使用fflush(stdout)。
答案 2 :(得分:0)
检查完代码之后,我能提出的唯一解决方案是for循环q->end
中的条件是&lt; = 0
答案 3 :(得分: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无关。
谢谢大家的建议。