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

PAT 基礎級 結構體練習:通訊錄錄入與查詢(結構-04)

     編輯:關於C語言

題目描述

輸入 N 條通訊錄記錄(姓名、生日、性別、固話、手機),然後輸入 K 個查詢索引,輸出對應記錄或 "Not Found"。

數據結構設計

struct Contact {
    char name[11];      // ≤10 字符
    char birthday[11];  // yyyy/mm/dd
    char gender;        // 'M' 或 'F'
    char tel[16];       // ≤15 位數字,可含 '+'
    char mobile[16];
};

完整 C 實現

#include <stdio.h>

struct Contact {
    char name[11];
    char birthday[11];
    char gender;
    char tel[16];
    char mobile[16];
};

int main(void) {
    int n;
    scanf("%d", &n);
    getchar(); // 吸收換行
    
    struct Contact contacts[n]; // C99 變長數組(VLA)
    
    // 錄入
    for (int i = 0; i < n; i++) {
        scanf("%10s %10s %c %15s %15s",
              contacts[i].name,
              contacts[i].birthday,
              &contacts[i].gender,
              contacts[i].tel,
              contacts[i].mobile);
        getchar();
    }
    
    int k;
    scanf("%d", &k);
    int query[k];
    for (int i = 0; i < k; i++)
        scanf("%d", &query[i]);
    
    // 查詢輸出
    for (int i = 0; i < k; i++) {
        int idx = query[i];
        if (idx >= 0 && idx < n) {
            printf("%s %s %s %c %s\n",
                   contacts[idx].name,
                   contacts[idx].tel,
                   contacts[idx].mobile,
                   contacts[idx].gender,
                   contacts[idx].birthday);
        } else {
            printf("Not Found\n");
        }
    }
    return 0;
}

關鍵技術點

  1. VLA(變長數組):struct Contact contacts[n] 根據運行時輸入 N 動態分配棧內存,避免固定大小數組浪費或溢出(需編譯器支持 C99)
  2. 格式化輸入保護:%10s 限制最大讀取字符數,防止緩衝區溢出
  3. 性別字符讀取:%c 前需處理殘留空白符,此處 scanf 格式串中 %10s 後緊跟 %c 會正確讀取下一個非空白字符
  4. 索引合法性檢查:idx >= 0 && idx < n 對應題目編號 0 到 N-1

常見失分原因

  • 未限制 scanf 字符串長度導致緩衝區溢出
  • 性別字符讀取錯誤(如誤讀空格/換行)
  • 輸出字段順序錯誤:題目要求「姓名 固話 手機 性別 生日」
  • 未處理 "Not Found" 大小寫

擴展:動態內存分配版(兼容 C89)

struct Contact *contacts = malloc(n * sizeof(struct Contact));
// ... 使用後 free(contacts);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved