char *str[10]; // 僅宣告 10 個指標,未指向有效記憶體
for (int i = 0; i < 10; i++)
gets(str[i]); // ❌ 寫入野指標,未定義行為
char str[10][100]; // 每行最多 99 字元 + \0
gets(str[i]); // 直接用陣列名退化為指標
char *str[10];
for (int i = 0; i < 10; i++) {
str[i] = malloc(100);
gets(str[i]);
}
// 使用後釋放
for (int i = 0; i < 10; i++) free(str[i]);
char buf[100];
for (int i = 0; i < 10; i++) {
gets(buf);
// 處理 buf...
}
gets() **已移除 (C11)**,無緩衝區長度檢查,極易緩衝區溢位。**務必改用 fgets(str, sizeof(str), stdin)**。
char str[10][100];
for (int i = 0; i < 10; i++) {
if (fgets(str[i], sizeof(str[i]), stdin) == NULL) break;
str[i][strcspn(str[i], "\n")] = '\0'; // 移除換行
}