1. 程式人生 > >C常見陷阱,scanf不執行,以及指針類型應用傳遞。

C常見陷阱,scanf不執行,以及指針類型應用傳遞。

struct 輸出 getc 線性 har 語言 工作 開始 不支持

1.最近寫了個結構體,一開始是這樣的:

typedef struct fsll

{

  int data_field;

  struct fsll *next;

}FSLL;

很普通的一個鏈表結構體,工作需要數據域改成char類型。

typedef struct fsll

{

  char data_field;

  struct fsll *next;

}FSLL;

...

for(...)

{

printf("請輸入數據域內容:")

scanf("%c",&p->data_field);

}

發現scanf每隔一句就會被跳過一次。執行結果就是鏈表中的數據域是這樣的:( )->(A)->( )->(C)->....

其實原因就是windows下,鍵入回車鍵產生了兩個字符:013 回車與010換行。編輯器把013回車作為判斷輸入結束的標誌,而010 也就是\n留在了輸入流的首端。第二次循環中。scanf的真正功能是從輸入流中讀取相應數量的字符,%d不會匹配\n,所以一般的數字鏈表不會產生這種問題。但%c,%s這種,可以從輸入流中讀取\n,也就造成了第二次scanf從鍵盤賦值得到了一個\n(輸出\n什麽也不顯示),效果看起來就像是scanf間歇性被跳過。解決辦法很簡單,就是每次用scanf獲取鍵盤的字符類型時,在語句前面調用一次getchar();消耗掉\n,以便scanf可以獲取正確的值。關於getchar的妙用還有很多,以後有機會慢慢講。

for(...)

{

printf("請輸入數據域內容:")

getchar();

scanf("%c",&p->next);

}

2.把建立線性表封裝成函數,實現在主函數中調用中,碰到了問題。由於純C語言並不支持引用傳遞,所以像這種寫法是會報錯的:

void create_linked_list(FSLL *&head);

但如果想讓參數在主函數與自定義函數之間傳遞(真正改變head的值),需要使用地址傳遞的方式,而用地址傳遞一個指針變量的寫法也是真的很難看:

void create_linked_list(FSLL **head);

沒錯,這就是把指針變量的地址傳進來,直接改地址對應的值,實現對實際參數的改變(真底層);

調用的時候是這樣:

FSLL *head;

create_linked_list(&head);

以上就結束了本片博客

typedef struct fsll

{

  int data_field;

  struct fsll *next;

}FSLL;

C常見陷阱,scanf不執行,以及指針類型應用傳遞。