需求:從鍵盤讀取多行字符串,存入數組供後續使用。直接用 char *arr[5] 存儲字符串字面量是錯誤的,因為字面量存儲在只讀區,且無法接收輸入。必須動態分配內存。
char *colour[5];
colour[0] = "red"; // 字面量,不可修改,無法接收 scanf 輸入
scanf("%s", colour[0]); // 未分配內存,段錯誤
#include
#include
int main() {
int n = 5;
int maxLen = 100; // 每行最大長度
// 1. 分配指針數組
char **colour = (char **)malloc(n * sizeof(char *));
if (!colour) return 1;
// 2. 循環分配每行緩衝區並讀取
for (int i = 0; i < n; i++) {
colour[i] = (char *)malloc(maxLen * sizeof(char));
if (!colour[i]) {
// 釋放已分配內存
for (int j = 0; j < i; j++) free(colour[j]);
free(colour);
return 1;
}
printf("請輸入第 %d 個字符串: ", i + 1);
if (scanf("%99s", colour[i]) != 1) { // 限制寬度防溢出
colour[i][0] = '\0';
}
}
// 3. 使用/打印
for (int i = 0; i < n; i++) {
printf("colour[%d] = %s\n", i, colour[i]);
}
// 4. 釋放內存(逆序)
for (int i = 0; i < n; i++) free(colour[i]);
free(colour);
return 0;
}
char **arr:指向指針的指針,模擬二維字符數組,行數動態可變。malloc 兩次:第一次分配行指針數組,第二次為每行分配字符緩衝區。scanf("%99s", ...):寬度限制 maxLen-1,防緩衝區溢出。// 替換 scanf 為 fgets
fgets(colour[i], maxLen, stdin);
// 移除末尾換行符
colour[i][strcspn(colour[i], "\n")] = '\0';
若項目允許 C++,強烈建議使用:
#include
#include
#include
int main() {
std::vector v(5);
for (int i = 0; i < 5; i++) std::cin >> v[i];
for (auto &s : v) std::cout << s << '\n';
}
自動管理內存、無溢出風險、代碼極簡,是 C++ 項目的首選。