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

C 語言合法識別字判斷:規則解析與 OJ 題解

     編輯:關於C語言

識別字命名規則 (C99/C11)

  • 首字元:字母 (A-Z, a-z) 或底線 _
  • 後續字元:字母、數字 (0-9)、底線
  • **不能是關鍵字** (如 int, for, while 等)
  • 大小寫敏感,長度無標準限制(編譯器通常支援極長)
  • 保留識別字:雙底線開頭 (__xxx)、底線+大寫開頭 (_Xxxx) 由實作保留

OJ 題目簡化版規則

多數線上判題題目(如 HDOJ 1028 / ZOJ 1199)僅檢查:

  1. 第一字元是否為字母或底線
  2. 其餘字元是否為字母、數字、底線
  3. **不檢查關鍵字**

C 語言判斷函數

#include <ctype.h>
#include <stdbool.h>

bool is_valid_identifier(const char *s) {
    if (!s || !*s) return false;           // 空字串
    if (!isalpha((unsigned char)*s) && *s != '_') return false; // 首字元
    for (++s; *s; ++s) {
        if (!isalnum((unsigned char)*s) && *s != '_') return false;
    }
    return true;
}

完整 OJ 解題程式 (HDU 1028 風格)

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

int main(void) {
    int T;
    char str[55];
    scanf("%d", &T);
    getchar(); // 吸收換行
    while (T--) {
        fgets(str, sizeof(str), stdin);
        str[strcspn(str, "\n")] = '\0'; // 去除換行

        bool ok = true;
        if (!isalpha(str[0]) && str[0] != '_') ok = false;
        for (int i = 1; ok && str[i]; ++i) {
            if (!isalnum(str[i]) && str[i] != '_') ok = false;
        }
        puts(ok ? "yes" : "no");
    }
    return 0;
}

測試樣例

輸入:
3
12ajf
fi8x_a
ff ai_2

輸出:
no
yes
no

解析:12ajf 以數字開頭 ❌;fi8x_a 合法 ✅;ff ai_2 含空格 ❌。

常見陷阱

  • 使用 scanf("%s") 會在空格處截斷,必須用 fgets 或 gets 讀整行
  • ctype.h 函數參數需轉 unsigned char 避免負值未定義行為
  • 題目若要求檢查關鍵字,需建立關鍵字集合 (約 32~37 個) 比對
  • 中文字元、全形符號均非合法識別字字元

正則表達式視角

^[A-Za-z_][A-Za-z0-9_]*$(不含關鍵字檢查)。

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