Here is a snippet of my code:
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');
Then here is the partial GDB log:
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)
as you can see, the line 172 printf("Queue:");
won't get executed, as well as the rest of the code. I cannot figure out why.
I typed d into command
Could someone help me explain this? Thanks.
I think your concern is that the printf
is traced in the debugger but no output is produced. This is probably because printf
calls send output to stdout
, which is usually buffered, so output may not appear until later when running in gdb. In some systems, the buffer is flushed when a newline is seen. So you might try adding \\n
to the end of "Queue:"
. Or fflush(stdout);
after the print will definitely cause the printf to work. Output to stderr
is not buffered. That's why you see that output immediately.
It is executed, as you can see in your single stepping of the code in the debugger. It doesn't print right away because printf() output is kept in a buffer until the buffer is full or until a newline is encountered. Either put a newline at the end or fflush(stdout) afterwards if you need to see the output immediately.
检查完代码后,我唯一能想到的解决方案是for循环q->end
是<= 0
all.
I think I've figure it out how: just to write another function to print out all the results.
So the modified code is like this:
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');
I know my code is messy, I am still a beginner of C programming language. I am in the progress of learning pointers.
There are some modifications in the "..." part of code, but I believe the changes are not related to I/O.
Thank you all for suggestions.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.