2013-10-22 51 views
0

這裏是我的代碼片段:代碼將不會執行在做while循環用C

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進入命令

有人能幫助我解釋一下嗎?謝謝。

+3

呃......因爲你之前打破了循環?無論如何,代碼是混亂的。它應該變得更簡單,更清晰,更不容易出錯。即使它工作。 –

+0

我在'command *'中鍵入'd',而不是'q'。 – hlx98007

+0

你確定print語句沒有執行嗎?我猜想q是null,你的問題是q-> end。由於I/O刷新問題,您不會看到printf。嘗試把fflush(stdout);在你的printf之後 –

回答

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無關。

謝謝大家的建議。

3

我認爲你的問題是printf在調試器中被跟蹤,但是沒有產生輸出。這可能是因爲printf調用發送輸出到stdout,這通常是緩衝,所以輸出可能不會出現,直到後來在gdb中運行。在某些系統中,當看到換行符時,緩衝區被刷新。因此,您可以嘗試將\n添加到"Queue:"的末尾。或者fflush(stdout);打印後肯定會導致printf工作。輸出到stderr未被緩衝。這就是爲什麼你立即看到輸出。

+0

底部的scanf沒有執行,它沒有要求我在GDB中輸入。 – hlx98007

+0

@ hlx98007這也是一個緩衝問題。第二個scanf獲取您在第一個字符後鍵入的換行符。解決這個問題的一個方法就是說'scanf(「%c」,&ch);'。%c之前的空格應該在獲得下一個字符之前清除緩衝區中的所有空白。 – Gene

+0

'處理這個問題的一種方法是scanf (「%c」,&ch);' 不知道爲什麼我的答案被downvoted - 是第一個回答並指出這一點。 – Sadique

3

它被執行,就像你在調試器中單步執行代碼一樣。它不會立即打印,因爲printf()輸出保存在緩衝區中,直到緩衝區已滿或遇到換行符爲止。如果您需要立即看到輸出結果,請在結尾處輸入換行符或在後面輸入fflush(stdout)。

0

檢查你的代碼,唯一的解決辦法,我可以拿出後,你在for循環q->end條件是< = 0

+0

這是正確的。我不知道爲什麼。 – hlx98007

+0

是的,但我不知道你給這個程序輸入了什麼樣的輸入,就賦予程序字符而言,有一個[更好的方法](http://stackoverflow.com/a/19508850/2089675)從stdin中讀取忽略換行符的字符,我建議這樣做,因爲這可能是您的scanf正在閱讀換行符characte r以及你認爲它沒有做任何事情 – smac89

+0

你說得對。我假設scanf忽略我輸入的換行符。我會改變這一點。 – hlx98007