题目
C语言合法标识符
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 123430 Accepted Submission(s): 46419
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
解题思路
合法标识符:为字母、数字、下划线组成,开头不能为数字,我的方法就是判断一下这个条件。注意的点就是,这里字符串可能包含空格,故我用string类的函数getline()来从键盘输入字符串。然后我运行时发现,对于n采用正常输入(cin>>n 或是scanf(“%d”, &n))时会出现如下图一个情况,可能是输入整型数据 n 时留在缓冲区的回车换行符‘\n’造成的,具体我也先不纠结啦,我采用了scanf(“%d\n”, &n),然后就解决了,OKK
也可以用一个字符,把缓冲区的回车‘\n’给吃了,感觉这个还更好理解,scanf那个带\n我还是有点懵逼。
char c;
scanf("%d%c", &n, &c);
不吃掉回车换行符‘\n’的输出是这样的
3
yes
a111
yes
11a
no
正确输出是这样的
3
a111
yes
11a
no
qqq w 1
no
代码
#include <iostream>
#include <string>
using namespace std;
//合法标识符:为字母、数字、下划线组成,开头不能为数字
int main() {
int n = 0;
string ss;
scanf("%d\n", &n);
while (n--) {
getline(cin ,ss); //以回车为结束标志,从键盘输入字符串
int len = ss.length();
int legal = true;
for (int i = 0; i < len; i++) {
if ((ss[0] >= '0' && ss[0] <= '9')) { //判断开头
legal = false;
break;
}
if (!( (ss[i] >= '0' && ss[i] <= '9') || (ss[i] >= 'a' && ss[i] <= 'z') || (ss[i] >= 'A' && ss[i] <= 'Z') || ss[i] == '_')) {
legal = false;
break;
}
}
if (legal) cout << "yes" << endl;
else cout << "no" << endl;
}
return 0;
}