輸入 hello world(含空格),scanf("%s", str) 僅讀取 hello,而 gets(str) 讀取整行 hello world。
| 函數 | 讀取起始 | 讀取終止條件 | 緩衝區殘留 |
|---|---|---|---|
scanf("%s") | 跳過空白字符(空格、制表符、換行符),遇第一個非空白字符開始 | 遇下一個空白字符(空格/制表符/換行符)停止,空白字符留在輸入流 | 空格、換行符仍在 stdin |
gets() | 直接從當前位置開始(不跳過空白) | 遇換行符 \n 停止,換行符被讀取並丟棄,不存入緩衝區 | 無殘留換行符 |
輸入流:h e l l o [空格] w o r l d [回車]\n
scanf("%s", s1):hello → 遇空格停止。[空格] world\ngets(s2):\n 停止 → 存入 world(含前導空格)。gets() 已從 C11 標準移除(C99 標記棄用),極易造成緩衝區溢出,嚴禁使用。fgets(str, sizeof(str), stdin):指定最大長度,保留換行符(需手動去除)。scanf("%99[^\n]", str):掃描集讀取至換行符(需配合 getchar() 吞掉換行符)。char line[1000];
if (fgets(line, sizeof(line), stdin)) {
line[strcspn(line, "\n")] = '\0'; // 去除尾部換行符
// 處理 line
}