2013-08-16 143 views
0

有誰知道下面的代碼可能是什麼問題?當我運行它,我得到以下的輸出:鏈接列表問題

Insert a value in the list: 1 
Do you want to continue? y/N: 
1 -> 

的事實是,do-while循環執行,直到scanf("%c", &ch)語句,然後它跳了出來(所以我不能提供的ch變量的任何輸入) 。我試着用GDB進行調試,我得到了一些奇怪的信息:

GI___libc_malloc (bytes=16) at malloc.c:malloc.c: No such file or directory. 

此外,它說,編譯器找不到vscanf.c文件。有沒有人對這種奇怪的行爲有解釋?謝謝! (其目的是爲了以倒序打印單鏈表的值。)

#include <stdio.h> 
#include <stdlib.h> 

struct node{ 
    int info; 
    struct node* next; 
}; 

struct node* head = 0; 

void add_node(int value){ 

    struct node* current = malloc(sizeof(struct node)); 
    current->info = value; 
    current->next = head; 
    head = current; 
} 

void print_node(struct node* head){ 

    while(head){ 

      printf(" %d -> ", head->info); 
      head = head->next; 
    } 

    printf("\n"); 
} 

int main(void){ 

    int val; 
    char ch; 

    do { 

     printf("Insert a value in the list: "); 
     scanf("%d", &val); 
     add_node(val); 
     printf("Do you want to continue? y/N: "); 
     scanf("%c", &ch); 

    } while(ch == 'y' || ch == 'Y'); 

    printf("\n"); 
    print_node(head); 
    return 0; 
} 
+0

這裏是一個完整的鏡頭,第二個'scanf'可以在換行符中讀取嗎? –

+0

將add_node的方法簽名更改爲接受struct node *參數,然後將head的地址作爲參數傳遞給您的函數調用。這應該做到這一點。 – Clocks

+0

GDB消息用於通知您無法步入GLIB文件,只需按c繼續。 – Clocks

回答

0

您遇到的問題是因爲您輸入的值爲val然後按回車鍵,則\n仍然保留在輸入緩衝區中。因此,下一個scanf假定仍然在輸入緩衝器中的\n是它的輸入,並消耗它然後循環退出。

其他解決方案: -

1)scanf("%d%*c",&val);

這將第一輸入字符分配給val並在那之後事情會被吃掉。因此,\n不會進入下一個scanf

2)scanf("%[^\n]%*c",&val);

這將分配什麼的val除了\n然後\n會被吃掉。

2

如果你想輸入一個新行(這似乎是你做的)分離,然後更改格式你如何閱讀你的角色。更改如下:

scanf("%c", &ch); 

...這樣的:

scanf("\n%c", &ch); // << Note, \n to pickup newline before reading the value. 
+0

如果這實際上是問題,他不能只是做'scanf(「%d \ n」,&val);'而不是做兩個'scanf's? –

+0

當你做'scanf(「%d \ n」,&val); ',程序等待輸入內容之外的東西,它只是在你輸入內容後打印並退出。 – sha1

+0

@Jacob,我知道在後面使用'\ n'',謝謝。但是,正如我所知,'scanf()'忽略'\ n''字符。我錯了嗎? – sha1

2

您可以在if-else塊檢查正確的輸入,並相應地執行代碼。 例如,這裏是東西,如果我需要檢查用戶是否希望繼續與否,我會做:

char chTemp; //Declare a test variable to check for newline 
printf("Do you want to continue? y/N: "); 
if (scanf("%c%c",&ch,&chTemp) != 2 || chTemp != '\n') 
{ 
    printf("Error in input (Integer input provided)"); 
} 
else 
{ 
    //Do stuff. 
} 

它不僅將解決你的問題,但它也將檢查粗心的整數輸入。