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

《C和指針》第一章實戰:列篩選重組工具完整實現與指針算術詳解

     編輯:關於C

程序功能

從標準輸入讀取列範圍對(如0 3 10 12 -1表示保留第0-3列和第10-12列),隨後逐行讀取文本,輸出原始行與篩選重組後的行。展示指針、數組、字符串處理、標準I/O的綜合應用。

核心數據結構

#define MAX_COLS 20      // 最大列對數
#define MAX_INPUT 1000   // 最大行長

int columns[MAX_COLS];   // 存儲列範圍端點:start0, end0, start1, end1...
char input[MAX_INPUT];   // 輸入緩衝區
char output[MAX_INPUT];  // 輸出緩衝區

關鍵函數解析

1. 讀取列範圍 read_column_numbers

int read_column_numbers(int cols[], int max) {
    int num = 0, ch;
    while (num < max && scanf("%d", &cols[num]) == 1 && cols[num] >= 0)
        num++;
    if (num % 2 != 0) {  // 必須成對
        puts("Last column number is not paired.");
        exit(EXIT_FAILURE);
    }
    while ((ch = getchar()) != EOF && ch != '\n'); // 清除行尾
    return num;
}

指針洞察:cols退化為指針,&cols[num]等價cols+num,演示數組參數實為指針。

2. 重組邏輯 rearrange

void rearrange(char *output, const char *input, int n_cols, const int cols[]) {
    int len = strlen(input);
    int out_col = 0;

    for (int col = 0; col < n_cols; col += 2) {
        int nchars = cols[col+1] - cols[col] + 1;  // 列寬

        if (cols[col] >= len || out_col == MAX_INPUT - 1) break; // 越界保護

        if (out_col + nchars > MAX_INPUT - 1)  // 截斷保護
            nchars = MAX_INPUT - out_col - 1;

        strncpy(output + out_col, input + cols[col], nchars); // 指針算術核心
        out_col += nchars;
    }
    output[out_col] = '\0'; // 手動終止
}

指針算術深度剖析

主流程 main

int main(void) {
    int n_cols = read_column_numbers(columns, MAX_COLS);
    while (gets(input) != NULL) {  // 注:gets不安全,教學代碼
        printf("Original input : %s\n", input);
        rearrange(output, input, n_cols, columns);
        printf("Rearranged line: %s\n", output);
    }
    return EXIT_SUCCESS;
}

現代化改造建議

  1. 替換gets → fgets(input, MAX_INPUT, stdin),移除尾部換行符
  2. 增加errno檢查與錯誤信息輸出到stderr
  3. 支持UTF-8多字節字符:改用mbrlen計算字符寬度
  4. 動態分配緩衝區支援任意長行
  5. 單元測試覆蓋:空輸入、列越界、重疊範圍、空行

教學價值總結

該程序以80行代碼完整演示:

  • 指針與數組的等價互換
  • 指針算術在字符串切片中的核心作用
  • 緩衝區邊界檢查的防禦性編程
  • 函數分解與單一職責原則
  • C標準庫string.h/stdio.h核心函數協作

是掌握C指針精髓的經典入門案例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
表達式等價形式語義
input + cols[col]&input[cols[col]]源字符串起始位置指針
output + out_col&output[out_col]目標緩衝區當前寫入位置
strncpy(dst, src, n)逐字節拷貝不自動添加\0,需手動終止