需求:輸入多字符串(以@結尾標記最後一個),輸出所有字符串並去除結尾@。
// 輸入: 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; }
需求:定義三個函數,通過函數指針數組調用,輸入次數與函數名,執行對應函數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)) | 將函數指針作參數傳遞,內部調用 |
typedef void (*FuncPtr)(void);malloc分配必配對free,指針置NULL