判断字符是否为字母,数字 HDU - 2024

同学问了我一道hdu的水题 

题号是2024 原题地址戳这里

C语言合法标识符

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


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

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

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

Sample Input
 
  
312ajffi8x_aff ai_2
 

Sample Output
 
  
noyesno
 
看到这题 最开始的想法就是 读入字符 然后判断是否在 a~z A~Z 1~9之间

标识符由字母、下划线、数字这三个方面组成,但开头必须是字母或下划线。

上代码(最普通的做法)ps:放了同学的代码 她的错误是少写了等号......已改正

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
int main()
{
    int n,flag;
    string a[10000];
    while(~scanf("%d\n",&n))
    {
        for(int i=0; i<n; i++)
            getline(cin,a[i]);
        for(int i=0; i<n; i++)
        {
            flag=0;
            if(a[i][0]=='_'||(a[i][0]>='a'&&a[i][0]<='z')||(a[i][0]>='A'&&a[i][0]<='Z'))
            {
                for(int j=1; j<a[i].length(); j++)
                {
                    if(a[i][j]=='_'||(a[i][j]>='a'&&a[i][j]<='z')||(a[i][j]>='A'&&a[i][j]<='Z')||(a[i][j]>='0'&&a[i][j]<='9'))
                        flag++;
                    else break;
                }
                if(flag==a[i].length()-1) cout<<"yes"<<endl;
                else cout<<"no"<<endl;
            }
            else cout<<"no"<<endl;
        }
    }
    return 0;
}

之后在 讨论区看到了有关用 标准函数 的做法

需要用到 头文件 #include <ctype.h>

先说 判断字母的函数   isalpha(  )

#include<iostream>
#include<stdio.h>
#include<ctype.h>
using namespace std;
int main()
{
    int n,flag;
    char c;
    scanf("%c",&c);
    int a=isalpha(c);//若 c 为字母,返回非零值;否则,返回0。
    printf("%d\n",a);//返回非零值为随机值 与字母大小无关
    return 0;
}

然后是 同时判断字母与数字的函数    isalnum(   )

#include<iostream>
#include<stdio.h>
#include<ctype.h>
using namespace std;
int main()
{
    int n,flag;
    char c;
    scanf("%c",&c);
    int a=isalnum(c);//若 c 为字母或数字,返回非零值;否则,返回0。
    printf("%d\n",a);//返回非零值为随机值 与数字字母大小无关
    return 0;
}

下面放一下用 标准函数 做的代码:
 
 
#include<iostream>
#include<stdio.h>
#include<string>
#include<ctype.h>
using namespace std;
int main()
{
    int n,flag;
    string str;
    while(~scanf("%d\n",&n))
    {
        getchar();
        for (int i=0; i<n; i++)
        {
            getline(cin,str);
            flag=0;
            if (isalpha(str[0])||str[0]=='_')
            {
                flag=1;
                for (int i=1; str[i]!=0; i++)
                    if (!isalnum(str[i])&&str[i]!='_')
                    {
                        flag=0;
                        break;
                    }
            }
            if (flag)
                printf("yes\n");
            else printf("no\n");
        }
    }
    return 0;
}

先这样吧~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值