杭电OJ_2024 C语言合法标识符

题目

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 
#include 

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;
}

你可能感兴趣的:(杭电OJ)