Reputation: 241
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.
Upvotes: 0
Views: 911
Reputation: 241
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.
Upvotes: 0
Reputation: 43078
After examining your code, the only solution I can come up with is that your condition in the for loop q->end
is <= 0
Upvotes: 0
Reputation: 2470
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.
Upvotes: 3
Reputation: 46960
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.
Upvotes: 3