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

C語言指針進階習題:指針數組、函數指針回調、字符串處理

     編輯:關於C語言

C語言指針進階習題:指針數組、函數指針回調、字符串處理

習題1:指針數組處理不定長字符串輸入

需求:輸入多字符串(以@結尾標記最後一個),輸出所有字符串並去除結尾@。

// 輸入: aaaaa bbbbb abcdefg asdf@
// 輸出:
// aaaaa
// bbbbb
// abcdefg
// asdf

實現要點

  • char *p[10]指針數組,每項malloc分配內存
  • scanf("%s", p[i])讀取以空白分隔的字符串
  • getchar() == '\n'檢測換行結束輸入
  • 指針運算*(*(p+i)+len-1)等價p[i][len-1]訪問最後字符
#include 
#include 

int main() {
    char *p[10] = {NULL};
    int cnt = 0;
    for (int i = 0; i < 10; i++) {
        p[i] = malloc(100); if (!p[i]) return -1;
        scanf("%s", p[i]); cnt++;
        int len = strlen(p[i]);
        if (p[i][len-1] == '@') p[i][len-1] = '\0';
        if (getchar() == '\n') break;
    }
    for (int i = 0; i < cnt; i++) printf("%s\n", p[i]);
    // 釋放內存...
    return 0;
}

習題2:函數指針回調機制實現

需求:定義三個函數,通過函數指針數組調用,輸入次數與函數名,執行對應函數N次。

核心代碼

void printWorld() { printf("world\n"); }
void printHello() { printf("hello\n"); }
void printWelcome() { printf("welcome\n"); }

// 回調函數:接收函數指針與次數
void callback(void (*func)(void), int count) {
    for (int i = 0; i < count; i++) func();
}

int main() {
    int n; scanf("%d", &n);
    // 函數指針數組
    void (*funcs[3])(void) = {printWorld, printHello, printWelcome};
    char *names[3] = {"printWorld", "printHello", "printWelcome"};
    
    char input[100]; scanf("%s", input);
    for (int i = 0; i < 3; i++) {
        if (strcmp(names[i], input) == 0) {
            callback(funcs[i], n);
            break;
        }
    }
    return 0;
}

關鍵知識點總結

概念聲明示例含義
指針數組char *p[10]10個char*指針,每個指向字符串
數組指針char (*p)[10]指向包含10個char的數組的指針
函數指針void (*pf)(int)指向參數為int、返回void的函數
指針函數int *func()返回int*指針的函數
回調函數void callback(void(*f)(void))將函數指針作參數傳遞,內部調用

實戰技巧

  1. 函數指針數組實現命令分發、狀態機、插件架構
  2. 指針數組管理不定長度字符串集合
  3. typedef簡化聲明:typedef void (*FuncPtr)(void);
  4. 內存管理:malloc分配必配對free,指針置NULL
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved