#include <stdio.h>
char *gets(char *str); // 已棄用,C11 移除
int puts(const char *str);
\nprintf("%s\n", str)\n 或 EOF 停止,不保留換行符,末尾加 \0scanf("%s") 區別:scanf 遇空白停止,gets 讀整行#include <stdio.h>
#include <string.h>
int main(void) {
char a[20] = {0};
char *p = a;
printf("What's your name?\n");
gets(a); // 危險!
puts(a);
puts("How old are you?");
gets(p); // 危險!
puts(p);
return 0;
}
static char str1[] = "An array example.";
static char str2[] = "A pointer example.";
puts(&str1[4]); // 從 'r' 開始輸出 → "ray example."
puts(str2 + 4); // 從 'i' 開始輸出 → "inter example."
原理:字符串以 \0 結尾,puts 從給定地址輸出至 \0。若字符數組缺少結尾 \0,將輸出亂碼直至偶然遇到 0 字節。
| 函數 | 用法 | 優點 |
|---|---|---|
| fgets | fgets(buf, sizeof(buf), stdin) | 指定最大讀取長度,保留 \n,安全標準 |
| gets_s | gets_s(buf, sizeof(buf)) | C11 附錄 K,檢查長度,不保留 \n |
| scanf | scanf("%19[^\n]", buf) | 指定寬度,不保留 \n |
char buf[100];
if (fgets(buf, sizeof(buf), stdin)) {
// 移除末尾換行符
buf[strcspn(buf, "\n")] = '\0';
puts(buf);
}
gets,必須識別並替換gets,編譯會警告但可通過gets 直接報錯或鏈接失敗puts 可安全用於簡單字符串輸出;gets 是臭名昭著的安全漏洞根源,絕對禁止在新代碼中使用。統一改用 fgets 或帶寬度限制的 scanf,並處理換行符殘留,是 C 語言字符串輸入的專業標準。