*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
lcy   |   We have carefully selected several similar problems for you:  2025 2026 2027 2030 2032 
 
 
本道题做到了好久,具体注意点如下:
 
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");
        }
 }

 

posted on 2020-03-27 13:22  沈香茶  阅读(203)  评论(0)    收藏  举报