hlx98007
hlx98007

Reputation: 241

Code won't execute in do while loop in C

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

Answers (4)

hlx98007
hlx98007

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

smac89
smac89

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

Andreas Bombe
Andreas Bombe

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

Gene
Gene

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

Related Questions