char *s, *t;
scanf("%s", s);
scanf("%s", t);
int tLen = strlen(t);
int sLen = strlen(s);
s 和 t 是未初始化的野指針,指向隨機內存地址。scanf("%s", s) 向隨機地址寫入數據,導致未定義行為(通常表現為段錯誤/訪問違例)。
char s[128], t[128]; // 固定大小緩衝區
scanf("%127s", s); // 限制寬度防止溢出
scanf("%127s", t);
int tLen = strlen(t);
int sLen = strlen(s);
char *s = malloc(128);
char *t = malloc(128);
if (!s || !t) { /* 處理分配失敗 */ }
scanf("%127s", s);
scanf("%127s", t);
// 使用後釋放
free(s);
free(t);
size_t maxLen = 128;
char s[maxLen], t[maxLen];
scanf("%127s", s);
scanf("%127s", t);
| 原則 | 說明 |
|---|---|
| 指針使用前必須指向有效內存 | 棧數組、malloc、calloc、strdup 等 |
| scanf 限制寬度 | %127s 防止緩衝區溢出(留 1 字節給 \0) |
| 檢查返回值 | if (scanf("%127s", s) != 1) { /* 輸入失敗 */ } |
| 釋放 malloc 內存 | 避免內存洩漏 |
| 啟用編譯器警告 | gcc -Wall -Wextra / MSVC /W4 會提示未初始化變量 |
bool safe_read_string(char *buf, size_t size) {
if (!buf || size == 0) return false;
// 清空緩衝區
buf[0] = '\0';
// 讀取整行,避免殘留換行符
if (!fgets(buf, size, stdin)) return false;
// 移除末尾換行符
size_t len = strlen(buf);
if (len > 0 && buf[len-1] == '\n') buf[len-1] = '\0';
return true;
}