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

C 語言合法識別符判斷:完整規則與 OJ 解法

     編輯:關於C

識別符命名規則

C 標準規定合法識別符必須滿足:

  1. 首字元:字母(a-z、A-Z)或底線 _。
  2. 後續字元:字母、數字(0-9)或底線 _。
  3. 長度限制:C99 以前無明確上限,實作通常 ≥ 31 字元;題目限制 ≤ 50 字元。
  4. 關鍵字不可用:int、if、while 等保留字不能作識別符(本題通常不檢查關鍵字,僅檢查字元組成)。

輸入輸出格式

  • 第一行整數 n,測試案例數。
  • 後續 n 行,每行一字串(可能含空格)。
  • 每案例輸出一行:yes 或 no。

完整解法

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

int is_valid_identifier(const char *s)
{
    if (!s || !*s) return 0;              // 空字串非法

    // 首字元檢查
    if (!isalpha((unsigned char)*s) && *s != '_')
        return 0;

    // 後續字元檢查
    for (const char *p = s + 1; *p; p++) {
        if (!isalnum((unsigned char)*p) && *p != '_')
            return 0;
    }
    return 1;
}

int main(void)
{
    int n;
    char line[101];                       // 題目上限 50,留餘量

    if (scanf("%d", &n) != 1) return 0;
    getchar();                            // 吸收換行

    while (n--) {
        fgets(line, sizeof(line), stdin);
        // 移除尾隨換行
        size_t len = strlen(line);
        if (len > 0 && line[len - 1] == '\n')
            line[--len] = '\0';

        printf("%s", is_valid_identifier(line) ? "yes" : "no");
        if (n > 0) putchar('\n');
    }
    return 0;
}

關鍵實作細節

  1. 使用 ctype.h 函式:isalpha、isalnum 可移植處理字母/數字,配合 (unsigned char) 轉型避免負值未定義行為。
  2. fgets 讀整行:樣本輸入 ff ai_2 含空格,scanf("%s") 會截斷,必須用 fgets。
  3. 移除換行:fgets 保留 \n,判斷前必須去除。
  4. 空字串處理:若輸入空行(僅換行),長度為 0,直接判定 no。

樣本驗證

輸入輸出說明
12ajfno首字元為數字
fi8x_ayes符合所有規則
ff ai_2no含空格(非字母數字底線)

進階延伸

  • 若需檢查關鍵字,可建立關鍵字集合(哈希表或有序陣列 + 二分搜尋)進一步過濾。
  • C11 引入 Unicode 識別符(UCN),實際編譯器支援度不一,競程通常僅考慮 ASCII。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved