详细介绍:老题新解|合法C标识符
《信息学奥赛一本通》第154题:合法C标识符
题目描述
给定一个不包含空白符的字符串,请判断是否是 C 语言合法的标识符号。题目保证这些字符串一定不是 C 语言的保留字。
C 语言标识符要求:
- 非保留字;
- 只包含字母、数字及下划线(
_
);- 不以数字开头。
输入格式
一行,包含一个字符串,字符串中不包含任何空白字符,且长度不大于 202020。
输出格式
一行,如果它是 C 语言的合法标识符,则输出 yes,否则输出 no。
输入输出样例 #1
输入 #1
RKPEGX9R;TWyYcp
输出 #1
no
大家好,我是莫小特。
这篇文章给大家带来《信息学奥赛一本通》中的第 154 题:合法 C 标识符。
一、题目描述
洛谷的题号是:B2155 合法 C 标识符
二、题意分析
这道题是信息学奥赛一本通练习题的第 154 题。
根据输入描述,输入一个字符串,长度不大于 20,并且不包含任何空白字符,所以使用 char 字符数组,元素个数为 150,可以使用 cin 来输入。
char str[150];
cin>>str;
输入完成后,分析题目,题目要求判断输入的字符串是否符合 C 语言的合法标识符,如果是输出 yes,否则输出 no。
根据题目中说明的 C 语言标识符要求,第一个非保留字,这个可以不写,因为涵盖比较多,无法使用 if 语句来实现。
第二点:只包含字母、下划线及数字,所以需要访问整个字符串,查询是否包含字母、数字以及下划线。
字符数组使用 strlen 函数求长度,使用 for 循环从下标 0 开始访问到结尾,末尾的下标是长度减 1。
for(int i=0;i<=strlen(str)-1;i++)
{
}
检查每一个字符,判断是否是字母,字母是包含大小写字母,数字及下划线。
if(str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z'||str[i]>='0'&&str[i]<='9'||str[i]<='_'){}
如果符合情况,就继续,条件语句空着不写或者使用 continue,如果遇到不是的可以使用一个变量来实现该功能,将其标注为另一个值。
int flag=1;
if(str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z'||str[i]>='0'&&str[i]<='9'||str[i]=='_'){}else{flag=0;//标注不是}
第三点,不以数字开头,所以只需要判断首个字符即可,直接进行判断,如果是数字,则修改变量 flag 结果为 0。
if (str[0]>='0'&&str[0]<='9')
{
flag=0;
}
之后只需要判断 flag 的值即可。
if(flag==1)
{
cout<<"yes";
}
else
{
cout<<"no";
}
按照样例输入对数据进行验证。
符合样例输出,到网站提交测评。
测试通过!
三、完整代码
该题的完整代码如下:
#include<iostream>#include<bits/stdc++.h>using namespace std;int main(){char str[150];cin>>str;int flag=1;for(int i=0;i<=strlen(str)-1;i++){if(str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z'||str[i]>='0'&&str[i]<='9'||str[i]=='_'){continue;}else{flag=0;//标注不是}}if (str[0]>='0'&&str[0]<='9'){flag=0;}if(flag==1){cout<<"yes";}else{cout<<"no";}return 0;}
四、总结
本题考察了字符串处理与合法性判断的基本方法,主要涵盖以下知识点:
1、知识点总结
(1)利用 strlen
获取字符串长度,并通过循环逐一检查字符。
(2)判断字符是否属于合法范围(字母、数字、下划线),注意条件逻辑的书写。
(3)额外判断首字符是否为数字,这是 C 语言标识符最核心的限制。
2、常见易错点
(1)条件语句中 ||
与 &&
优先级问题,若未加括号可能导致逻辑错误。
(2)遗漏对下划线 '_'
的判断,导致合法标识符被判为不合法。
(3)错误地写成 str[i]<'_'
而不是 str[i]=='_'
,产生 bug。
(4)忘记单独判断首字符是否为数字,导致如 123abc
被判为合法。
3、解题建议
(1)编写条件时建议多加括号,保证逻辑清晰。
(2)遇到类似合法性判断题,可以先写出规则,再逐条实现,避免遗漏。
(3)在调试时,可以先输出每个字符的 ASCII 值,帮助确认条件范围是否正确。
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我哦!
如果有更好的方法也可以在评论区评论哦,我都会看哒~
我们下集见~