*HDoj 2024 C语言合法标识符
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
Author
lcy
Source
Recommend
本道题做到了好久,具体注意点如下:
1在每个测试用例中,有的测试用例含有空格,而在scanf和cin中,遇到空格会中断输入,所以本题用gets()来接受每个字符串
2无论是scanf还是gets,在接受一个字符串输入时,按下回车后,终止输入,编译器会自动给字符串的末尾添加一个 '\0'表明字符串的结束
3注意一开始用scanf输入测试用例个数n后按下的回车键仍在键盘缓冲区内,会被 gets() 当成一个字符串,得用getchar()吸收掉
4合法标识符由 字母数字下划线组成,并且必须以字母和下划线开头(这句中的字母既包含了大写字母又包含了小写字母,所以得注意)
5 gets()读取的是字符串以\n为结尾的,所以在用gets输入时按下的回车符会被吃掉,不用之后再写个getchar()吸收
C语言代码如下:
#include<stdio.h> int main() { char s[100]; int n=0; int flag; // printf("%d",(int)'\n'); //用于查看回车键的ASIIC码值 scanf("%d",&n); getchar(); for(int i=0;i<n;i++) { flag=1; gets(s); if( !(s[0]=='_' || (s[0]>='a'&&s[0]<='z') || (s[0]>='A'&&s[0]<='Z') ) ) { printf("no\n"); continue; } for(int j=1;s[j]!='\0';j++) { if(!( s[j]=='_' || (s[j]>='a'&&s[j]<='z')|| (s[j]>='A'&&s[j]<='Z') ||(s[j]>='0'&&s[j]<='9') )) { printf("no\n"); flag=0; break; } } if(flag==0) continue; printf("yes\n"); } }
浙公网安备 33010602011771号