📄 cffx.txt
字号:
#include "stdafx.h"
#include "ctype.h"
#include "string.h"
#include "stdio.h"
/*定义一个全局变量,一个全局指针*/
FILE *fp; /*fp是一个指向FILE类型结构的指针变量,可以使fp指向某一个文件
的结构变量,从而通过该结构体变量中的文件信息访问该文件*/
int id; /*标志变量,用来标识各类型的ID*/
/*主函数*/
void main()
{
/*自定义函数的声明*/
char cbuffer;
char alphaprocess(char buffer);
char digitprocess(char buffer);
char otherprocess(char buffer);
if ((fp=fopen("example.c","r"))==NULL) /*以只读方式打开文件"example.c",NULL在 stdio.h文件中已被定义为0*/
printf("error");
else
{
cbuffer=fgetc(fp); /*文件不为空则从文件中取字符*/
while (cbuffer!=EOF) /*EOF文件结束标志*/
{
if(cbuffer==' '||cbuffer=='\n') /*掠过空格和回车符*/
{
cbuffer=fgetc(fp);
id=4;
}
else
if(isalpha(cbuffer))
cbuffer=alphaprocess(cbuffer); /*检查cbuffer是否为字母,是则调用alphaprocess()函数*/
else
if (isdigit(cbuffer))
cbuffer=digitprocess(cbuffer); /*检查cbuffer是否为数字0~9,是则调用digitprocess()函数*/
else cbuffer=otherprocess(cbuffer); /*非上述两者则调用otherprocess()函数*/
}
}
}
/*主函数结束*/
/*处理读取字符为字母的情况*/
char alphaprocess(char buffer)
{
int search(char searchchar[],int wordtype); /*函数声明*/
int atype;
int i=-1;
char alphatp[20]; /*字符数组存储从文件中读取的字符*/
while((isalpha(buffer))||(isdigit(buffer))||buffer=='_'||buffer=='.') /*标识符的组成成分*/
{
alphatp[++i]=buffer; /*将当前读取的字符存如数组*/
buffer=fgetc(fp); /*读取下一个字符*/
}
alphatp[i+1]='\0'; /*字符串以'\0'作为结束标志*/
atype=search(alphatp,1); /*调用函数,判断当前字符串是否为关键字*/
if(atype!=0) /*是关键字则输出该关键字,编号为1,并输出该关键字在关键字表中的位子*/
{
printf("(%s, (1,%d))\n",alphatp,atype);
id=1; /*关键字的ID为1*/
}
else
{
printf("(%s ,2)\n",alphatp); /*为标识符时,编号为2*/
id=2; /*标识符的ID为2*/
}
return(buffer);
}
/*判断字符串是否为关键字*/
int search(char searchchar[],int wordtype)
{
char *key[32]={"auto","break","case","char","const","continue","default","do",
"double","else","enum","extern","float","for","goto","if","int","long",
"register","return","short","signed","sizeof","static","struct",
"volatile","while","switch","typedef","union","unsigned","void"};
/*设置数组指针存储c语言中的32个关键字*/
int i;
int p;
switch (wordtype)
{
case 1:for (i=0;i<=31;i++)
{
if (strcmp(key[i],searchchar)==0) /*比较字符串,为关键字则定位该关键字的序号*/
{ p=i+1; break; }
else p=0;
}
return(p);
}
}
/*alphaprocess()函数结束*/
/*处理读取字符为数字时的情况*/
char digitprocess(char buffer)
{
int i=-1;
char digittp[20];
while ((isdigit(buffer))||buffer=='.'||buffer=='e'||buffer=='E')//考虑数字为小数和指数时的情况
{
digittp[++i]=buffer;
buffer=fgetc(fp); /*同上*/
}
digittp[i+1]='\0';
printf("(%s ,3)\n",digittp); /*输出该数字,编号为3*/
id=3; /*设置ID为3*/
return(buffer);
}
/*digitprocess()函数结束*/
/*处理读出字符为其他字符的情况*/
char otherprocess(char buffer)
{
int n=0;
char ch[20];
ch[0]=buffer;
ch[1]='\0';
if(ch[0]=='%'||ch[0]=='\\')
{ buffer=fgetc(fp);
ch[1]=buffer;
ch[2]='\0';
printf("(%s ,5)\n",ch);
id=4;
buffer=fgetc(fp);
return(buffer);
}
if(ch[0]=='&')
{
buffer=fgetc(fp);
if(buffer!='&')
{
printf("(%s ,5)\n",ch);
id=4;
return(buffer);
}
if(buffer=='&')
{
ch[1]=buffer;
ch[2]='\0';
printf("(%s ,4)\n",ch);
id=3;
buffer=fgetc(fp);
return(buffer);
}
}
if(ch[0]==','||ch[0]==';'||ch[0]=='{'||ch[0]=='}'||ch[0]=='('||ch[0]==')')
{
printf("(%s ,5)\n",ch);
buffer=fgetc(fp);
id=4;
return(buffer);
}
if(ch[0]=='*'||ch[0]=='/')
{
printf("(%s ,4)\n",ch);
buffer=fgetc(fp);
id=4;
return(buffer);
}
if(ch[0]=='='||ch[0]=='!'||ch[0]=='<'||ch[0]=='>')
{
buffer=fgetc(fp);
if(buffer=='=') /*防止'==','!=','<=','>='符号的分离*/
{
ch[1]=buffer;
ch[2]='\0';
printf("(%s ,4)\n",ch);
}
else
{
printf("(%s ,4)\n",ch);
id=4;
return(buffer);
}
buffer=fgetc(fp);
id=4;
return(buffer);
}
if(ch[0]=='+'||ch[0]=='-')
{
if(id==4) /*如果'+','-'前ID为4的字符则可能为正负数或'++','--',否则为加减号*/
{
for(int i=1;i<10;i++)
{
buffer=fgetc(fp);
if(buffer=='+')
{
ch[1]='+';ch[2]='\0';
id=4;
goto L;
break; /*跳出for循环体*/
}
if(buffer=='-')
{
ch[1]='-';
ch[2]='\0';
id=4;
goto L;
break; /*跳出for循环体*/
}
if((buffer==',')||(buffer==';')||(buffer=='+')||(buffer=='-')||(buffer==')'))
break; /*防止将+562;+562,+562+,+562-,+561)作为整体输出*/
ch[i]=buffer;
ch[i+1]='\0';
}
printf("(%s ,3)\n",ch);
id=3;
//buffer=fgetc(fp);
return(buffer);
}
ch[2]='\0';
L: printf("(%s ,4)\n",ch);
buffer=fgetc(fp);
id=4;
return(buffer);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -