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

C語言指針數組查找函數實現:字符串排序與查找完整示例

     編輯:程式設計疑難解答

問題背景

使用指針數組 `char *name[4]` 存儲 4 個字符串,已實現輸入、排序、輸出,需補充 `search` 函數實現按名稱查找並輸出序號。

完整可運行代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void input(char *name[], int n);
void sort(char *name[], int n);
void print(char *name[], int n);
void search(char *name[], int n);

int main() {
    char *name[4];
    int n = 4;
    input(name, n);
    sort(name, n);
    print(name, n);
    search(name, n);
    // 釋放內存
    for (int i = 0; i < n; i++) free(name[i]);
    return 0;
}

void input(char *name[], int n) {
    int i;
    printf("請輸入4個字符串:\n");
    for (i = 0; i < n; i++) {
        name[i] = (char *)malloc(32 * sizeof(char)); // 分配足夠空間
        gets(name[i]); // 注意:gets 不安全,建議用 fgets
    }
}

void sort(char *name[], int n) {
    char *temp;
    int i, j, k;
    for (i = 0; i < n - 1; i++) {
        k = i;
        for (j = i + 1; j < n; j++)
            if (strcmp(name[k], name[j]) > 0)
                k = j;
        if (k != i) {
            temp = name[i];
            name[i] = name[k];
            name[k] = temp;
        }
    }
}

void print(char *name[], int n) {
    int i;
    printf("字符串排序結果:\n");
    for (i = 0; i < n; i++)
        printf("%s\n", name[i]);
}

void search(char *name[], int n) {
    char str[32] = {0};
    printf("請輸入要查找的字符串: ");
    scanf("%s", str);
    int i;
    for (i = 0; i < n; i++) {
        if (strcmp(name[i], str) == 0) {
            printf("找到字符串,序號為: %d\n", i + 1);
            return;
        }
    }
    printf("未找到字符串\n");
}

關鍵點解析

  1. 內存分配:`malloc(32)` 確保足夠存儲輸入字符串,避免緩衝區溢出。
  2. 排序算法:選擇排序,交換指針而非複製字符串,效率高。
  3. 查找邏輯:遍歷指針數組,用 `strcmp` 比較,找到即返回序號(1-based)。
  4. 輸入處理:`scanf("%s", str)` 讀取無空格字符串;若含空格需用 `fgets`。

常見錯誤避坑

  • 未分配內存直接 `gets(name[i])` 導致野指針崩潰。
  • 查找時用 `==` 比較字符串地址而非內容。
  • 排序迴圈邊界錯誤(如 `i < n` 而非 `i < n-1`)。

總結

指針數組操作字符串的核心是「管理指針,不動數據」。查找函數只需線性遍歷配合 `strcmp` 即可,清晰高效。

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