Problem Description
輸入一個字符串,判斷其是否是C的合法標識符。
Input
輸入數據包含多個測試實例,數據的第一行是一個整數n,表示測試實例的個數,然后是n行輸入數據,每行是一個長度不超過50的字符串。
Output
對於每組輸入數據,輸出一行。如果輸入數據是C的合法標識符,則輸出"yes",否則,輸出“no”。
Sample Input
3 12ajf fi8x_a ff ai_2
Sample Output
no yes no
思路:很簡單的題,C語言合法標識符定義為僅由字母,數字,下划線構成,且首字符必須為字母或下划線。讀取一個字符串后用循環對每一個字符進行判斷,若每一個字符都合法,則標志變量為0.
備注:1.輸入問題。一開始想用cin直接輸入字符串,但是測試數據是有空格的,cin無法讀取空格。后來改用cin.getline(),但是它的操作對象是字符數組。最后才找到getline()函數。
2.判斷問題。一開始是想用ASCII碼進行判斷,但是寫出來的程序略顯冗余,想着寫一個判斷函數,但是代碼量還是沒有得到簡化,最后想起來<cctype>/<ctypr.h>頭文件里有函數可以直接用。
1 #include<iostream> 2 #include<cctype> 3 using namespace std; 4 int main() 5 { 6 int n; 7 cin >> n; 8 getchar(); 9 while (n--) 10 { 11 string a; 12 getline(cin,a); 13 if (isalpha(a[0])||a[0]=='_')//isalpha(a)判斷a是否為字母,若是則返回0; 14 { 15 int flag = 1; 16 for (int i = 1; i < a.size(); i++) 17 { 18 if (isalnum(a[i])|| a[i] == '_') flag=0;//isalnum(a)判斷a是不是字母或數字,若是則返回0; 19 else { flag++; break; }; 20 } 21 if (flag) cout << "no"; 22 else cout << "yes"; 23 } 24 else cout << "no"; 25 cout << endl; 26 } 27 return 0; 28 }
函數名稱 | 返回值 |
isalnum() | 如果參數是字母數字,即字母或數字,該函數返回true |
isalpha() | 如果參數是字母,該函數返回真 |
isblank() | 如果參數是空格或水平制表符,該函數返回true |
iscntrl() | 如果參數是控制字符,該函數返回true |
isdigit() | 如果參數是數字(0~9),該函數返回true |
isgraph() | 如果參數是除空格之外的打印字符,該函數返回true |
islower() | 如果參數是小寫字母,該函數返回true |
isprint() | 如果參數是打印字符(包括空格),該函數返回true |
ispunct() | 如果參數是標點符號,該函數返回true |
isspace() | 如果參數是標准空白字符,如空格、進紙、換行符、回車 、水平制表符或者垂直制表符,該函數返回true |
isupper() | 如果參數是大寫字母,該函數返回true |
isxdigit() | 如果參數是十六進制的數字,即0~9、a~f、A~F,該函數返回true |
tolower() | 如果參數是大寫字符,則返回其小寫,否則返回該參數 |
toupper() | 如果參數是小寫字母,則返回其大寫,否則返回該參數 |
以上列出了<cctype>函數及用法,轉自https://www.cnblogs.com/zy691357966/p/5480456.html
另:本題未考慮C語言合法標識符不應含有關鍵字,否則更加麻煩。