HDOJ 2024

来源:互联网 发布:java 开发环境 编辑:程序博客网 时间:2024/05/22 14:13

题目:

C语言合法标识符

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 35055    Accepted Submission(s): 14112


Problem Description
输入一个字符串,判断其是否是C的合法标识符。
 

Input
输入数据包含多个测试实例,数据的第一行是一个整数n,表示测试实例的个数,然后是n行输入数据,每行是一个长度不超过50的字符串。
 

Output
对于每组输入数据,输出一行。如果输入数据是C的合法标识符,则输出"yes",否则,输出“no”。
 

Sample Input
312ajffi8x_aff ai_2
 

Sample Output
noyesno


在线测试地址:

http://acm.hdu.edu.cn/showproblem.php?pid=2024


算法:(PS: 该算法的主体思路借鉴了http://blog.sina.com.cn/s/blog_8ebb07c70100v095.html,在此表示感谢。)

    读入n

    n自减大于0时读入字符串

    统计读到的字符串,符合条件的输出相应的结果


代码:

#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX 100int main(){    int i, j, n, mark;    char c, ch[MAX];  //不初始化会导致程序错误。    while(scanf("%d", &n)!=EOF)    {        getchar(); //把输入n时伴随的回车符读掉,否则影响下面的判断        for(i=0;i<n;i++)        {            char ch[MAX]={0};   //每次读取完了都要初始化字符串数组,否则会叠加上次的输入。但为什么一定要加char才编译无误?            for(j=0;(c=getchar())!='\n';j++)  //当输入为ctrl_z的时候要连续enter才出现no的信息,错误(?)                ch[j]=c;            //gets(ch);  //gets()并不把换行符读入缓冲区         /* for(j=0;ch[j]!='\0';j++)                printf("%c", ch[j]);            printf("\n");  */        //  puts(ch);   //用来测试gets()方法得到的字符串和getchar()方式得到的字符串的差别            if(ch[0]>='0'&&ch[0]<='9')            {                printf("no\n");                continue;            }            mark=0;            for(j=0;j<strlen(ch);j++)            {                if(ch[j]>='0'&&ch[j]<='9' || ch[j]>='a'&&ch[j]<='z' || ch[j]>='A'&&ch[j]<='Z' || ch[j]=='_')                    ++mark;            }            if(mark==strlen(ch))                printf("yes\n");            else                printf("no\n");        }    }}

总结:

要用到最底层的IO功能,就一定要有自行管理存储的意识。要用一个个字符读入的方式,就要注意清除历史残留。gets()函数早就封装好这个层面的信息了,只是用的时候不曾意识到。


0 0
原创粉丝点击