首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言鍵盤輸入多個字符串存入字符指針數組的正確姿勢

     編輯:程式設計綜合問答

需求:從鍵盤讀取多行字符串,存入數組供後續使用。直接用 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++ std::vector

若項目允許 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++ 項目的首選。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved