C常見陷阱,scanf不執行,以及指針類型應用傳遞。
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不執行,以及指針類型應用傳遞。