北航计算机机试12统计关键字位置
统计关键字出现位置
输入:
一行标准c语言代码(字符个数小于300),统计出该字符串中关键字的if,while,for所在的位置,按照关键字出现的顺序依次输出。注意双引号内的不需要统计。
输入:一行标准c语言代码,字符个数小于300
输出:
关键字if,while,for对应的位置,按照关键字出现的顺序依次输出。输出格式为:关键字,后跟冒号,然后是出现的位置。扫描到关键字就输出,每个输出占一行。
样例输入:
#include <stdio.h> int main() {int i = 0; if(i == 0) printf("YES"); return 0;}# include <stdio.h> int main() {int ifwhile = 0; int forif = 1;char if_for_while = 'a';char *str = "while"; while(ifwhile == 0) {ifwhile = 1;forif = 0;} if(forif == 0) {if_for_while = 'b';}if(ifwhile == 1) {if_for_while = 'c';} return 0;}
样例输出:
if:43
while:108
if:153
if:190
首先你要知道C语言对于变量的命名规则:
标识符只能由英文字母,数字和下划线组成;
标识符必须以字母或者下划线开头;
不允许使用关键字。
思路:我总觉得是我太死板了,本来准备用下数据结构或者什么算法,发现还没有直接暴力来的妥当。。。。。
思路就是:
有两个封闭
#include<stdio.h>
#include<string.h>
#define N 300
int iswhat(char sign);
int main()
{
char a[N];
//fgets(a,sizeof(a),stdin);
FILE *fp;
if((fp=fopen("demo.txt","r"))!=NULL)
{
fgets(a,N,fp);
puts(a);
fclose(fp);
}
int flag=0;//标志是否在双引号中
int isblack=0;//标志是否是非字母,数字,下划线和双引号
int len=strlen(a)-1;
for(int i=0;i<len;i++)
{
if(iswhat(a[i])==4 || flag==0)
{
if(iswhat(a[i])==0)
{
isblack=1;
}
else if(isblack==1 && iswhat(a[i])==1)//第一个字母
{
if(a[i]=='i'&& a[i+1]=='f' && iswhat(a[i+2])==0 && i+2<len)
printf("if:%d\n",i+1);
else if(a[i]=='w' && a[i+1]=='h' && a[i+2]=='i'&& a[i+3]=='l'&&a[i+4]=='e'&&iswhat(a[i+5])==0&&i+5<len)
printf("while:%d\n",i+1);
else if(a[i]=='f' && a[i+1]=='o' && a[i+2]=='r' && iswhat(a[i+3])==0 && i+3<len)
printf("for:%d\n",i+1);
else
isblack=0;
}
else if(iswhat(a[i])==4)
{
if(flag==0)
{
flag=1;//禁止访问
}else {
flag=0;
}
}else{
continue;
}
}
}
return 0;
}
int iswhat(char sign)
{
if(sign>='a' && sign<='z')
return 1;//是字母
else if(sign<='9' && sign>='0')
return 2;//是数字
else if(sign=='_')
return 3;//是下划线
else if(sign=='"')
return 4;//是冒号
else
return 0;//什么都不是
}
error:
error C2018: unknown character ‘0xa1’
一不小心把输入法改成了全角,全角空格是会编译出错的。