C 標準規定合法識別符必須滿足:
a-z、A-Z)或底線 _。0-9)或底線 _。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;
}
ctype.h 函式:isalpha、isalnum 可移植處理字母/數字,配合 (unsigned char) 轉型避免負值未定義行為。fgets 讀整行:樣本輸入 ff ai_2 含空格,scanf("%s") 會截斷,必須用 fgets。fgets 保留 \n,判斷前必須去除。no。| 輸入 | 輸出 | 說明 |
|---|---|---|
12ajf | no | 首字元為數字 |
fi8x_a | yes | 符合所有規則 |
ff ai_2 | no | 含空格(非字母數字底線) |
UCN),實際編譯器支援度不一,競程通常僅考慮 ASCII。