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

C語言實現「符號與數字混存」數組的三種方案

     編輯:C 語言問答

核心問題

C 語言數組要求 元素類型統一,無法直接在同一個 int[] 或 char[] 中同時存放「字符」與「整數值」。但可通過以下三種工程化方案實現混存需求。

方案一:統一用 char 類型(ASCII 碼存儲)

利用 char 本質是 1 字節整數,可存 0-255 的值:

char buffer[100];
// 存數字 65 -> 'A' (ASCII 65)
// 存符號 '+' -> 43
buffer[0] = 65;   // 實際存 'A'
buffer[1] = '+';  // 實際存 43

// 讀取時需知道位置含義
if (is_alpha_pos(0)) printf("字符: %c\n", buffer[0]);
else printf("數值: %d\n", buffer[0]);

⚠️ 缺點:需自行維護「哪個位置存字符、哪個存數值」的映射規則,易出錯。

方案二:結構體數組(類型標記 + 聯合體)

每個元素攜帶類型標識,運行時動態判斷:

typedef enum { TYPE_CHAR, TYPE_INT } DataType;

typedef struct {
    DataType type;
    union {
        char ch;
        int num;
    } value;
} MixedItem;

MixedItem arr[10];
arr[0] = (MixedItem){TYPE_CHAR, .value.ch = 'A'};
arr[1] = (MixedItem){TYPE_INT,  .value.num = 65};

void print_item(MixedItem *p) {
    if (p->type == TYPE_CHAR) printf("字符: %c\n", p->value.ch);
    else printf("整數: %d\n", p->value.num);
}

✅ 優點:類型安全、擴展性強(可加 float/double)、代碼可讀性高。

方案三:平行數組(結構化編程風格)

分離存儲,索引對應:

char symbols[100];
int  numbers[100];
int  sym_cnt = 0, num_cnt = 0;

// 存入
symbols[sym_cnt++] = '+';
numbers[num_cnt++] = 42;

// 遍歷處理
for (int i = 0; i < sym_cnt; i++) handle_symbol(symbols[i]);
for (int i = 0; i < num_cnt; i++) handle_number(numbers[i]);

✅ 優點:簡單、無類型轉換、緊湊內存、適合「批量同類處理」場景。

方案對比與選型建議

場景推薦方案理由
簡單協議解析(如表達式求值)方案二(結構體+聯合體)需區分操作數/運算符,類型安全關鍵
純數據收集,後期分類處理方案三(平行數組)內存局部性好,遍歷快,代碼最簡潔
極度受限內存(嵌入式 < 2KB RAM)方案一 + 位圖標記節省結構體開銷,需嚴格文檔化位置約定

進階技巧:_Generic 關鍵字(C11)

編譯期根據類型自動選擇處理函數,配合方案二可實現類似多態:

#define PRINT(x) _Generic((x), \
    char: print_char, \
    int: print_int \
)(x)

void print_char(char c) { printf("char: %c\n", c); }
void print_int(int n) { printf("int: %d\n", n); }

// 使用
PRINT('A');  // 展開為 print_char('A')
PRINT(65);   // 展開為 print_int(65)

總結

C 語言無原生「混合類型數組」,但通過 聯合體+類型標記(方案二)可獲得最佳工程質量;平行數組(方案三)適合高性能批量處理;char 統一存儲(方案一)僅限極簡場景。選型原則:優先類型安全,次求性能,最後才是節省鍵盤敲擊。

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