⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 varparse.cpp

📁 变量解析程序
💻 CPP
字号:

#include<stdlib.h>
#include<stdio.h>
#include<string.h>

#define MAX	200  //最大200个变量
#define LEN	300

int j=0;int n=0;
bool flag=0;
bool funflag=0;
struct var  //  定义结构体
	{
	int id;
	char *varname;			// 变量名
	char *vartype;			//  变量类型
	}varpar [MAX];
/*******************************************
 初始化函数
********************************************/

void init()
{             
    char *key[]={"char","double","float","int","long","short","signed","struct","typedef","unsigned"};     /*C语言所有关键字,共32个*/
    FILE *fp;
    int i;
    fp=fopen("k.txt","w");
    for(i=0;i<10;i++)
       fprintf(fp,"%s\n",key[i]);
    fclose(fp);               /*初始化关键字表*/

    fp=fopen("output.txt","w");
    fclose(fp);               /*初始化输出文件*/
}


/*******************************************
  判断输入的字符串是否为变量类型关键字
********************************************/
int cmpword(char *buf)
{             //
    int number=0;
    FILE *fp;
    char c;
    char temp[30];
    int i=0;
    fp=fopen("k.txt","r");   //打开变量类型对照文件
    c=fgetc(fp);
    while(c!=EOF)
    {
        while(c!='\n')
        {
            temp[i++]=c;
            c=fgetc(fp);
        }
        temp[i]='\0';
        i=0;
        number++;
        if(strcmp(temp,buf)==0)      //比较字符串是否相等
        {  
		    fclose(fp);
			return(number);        /*若相等,返回在相应表中的序号*/
        }
        else
           c=fgetc(fp);
     }
		return(0);  
	 
}




/*******************************************
 扫描程序
********************************************/
void scanner()
{            
    FILE *fpin;
//    char filename[20];
    char ch;
	char line[LEN];
    int i=0,m=0;
    int count;
	char array[30];
    char *word;
//	printf("\nthe file name:");
//    scanf("%s",filename);
    if((fpin=fopen("test.txt","r"))==NULL)
    {
        printf("cannot open file");
        return;
    }
    ch=fgetc(fpin);
    while(ch!=EOF)
    {                 /*按字符依次扫描源程序,直至结束*/
        i=0;
        if(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z')))
        {     funflag=0;      /*以字母开头*/
            while(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))||(ch=='_')||(ch=='('))
            {
                array[i++]=ch;
                ch=fgetc(fpin);
				if(ch=='(')
					funflag=1; //判断所取字符串是不是函数名,是函数名标记为1
			
            }
            word=(char *)malloc((i+1)*sizeof(char));
			memcpy(word,array,i);
			word[i]='\0';
            n=cmpword(word);
			if((n!=0)&(funflag==0))   //判断是变量并且不是函数名
			{varpar[j].vartype=word;flag=1;varpar[j].id=n;}
			if((n==0)&(flag==1)&(funflag==0))
			{  varpar[j].varname=word;flag=0;j=j+1;}
            if(ch!=EOF)
			   fseek(fpin,-1L,SEEK_CUR);
        }
       
		else if(ch=='/')
        {                 /*消除注释*/
			ch=fgetc(fpin);
	        if(ch=='/')
			{ fgets(line,LEN,fpin); ch=fgetc(fpin); }  /*判断是否为‘//’注释开始*/
			 if(ch=='*')
			{              /*若为注释的开始,消除包含在里面的所有字符*/
				count=0;
				ch=fgetc(fpin);
				while(count!=2)
                {          /*当扫描到‘*’且紧接着下一个字符为‘/’才是注释的结束*/
					count=0;
					while(ch!='*')
						ch=fgetc(fpin);
					count++;
					ch=fgetc(fpin);
					if(ch=='/')
						count++;
					else
						ch=fgetc(fpin);
				}
			}
		}

		else
         ch=fgetc(fpin); 
    }
    fclose(fpin);
}


/***********************************************************
排序
**********************************************************/
void order()
{   
	int i=0,k=0,prt=0; 
	char *str1,*str2,*temptype,*tempname;//*temptype,*tempname排序的中间变量
for(i=0;i<j;i++) 
{for(k=0;k<j-i-1;k++) 
	{ str1=varpar[k].varname;str2=varpar[k+1].varname;
 	prt=strnicmp(str1,str2,1);
	 if(prt>0) 
		{ 
		tempname=varpar[k].varname; 
		temptype=varpar[k].vartype; 
		varpar[k].varname=varpar[k+1].varname;
		varpar[k].vartype=varpar[k+1].vartype; 
		varpar[k+1].varname=tempname; 
		varpar[k+1].vartype=temptype; 
		} 
	}
}
}

/***********************************************************
打印输出函数
**********************************************************/
void print()
{   FILE *fpout;
	int i=0;  printf("SN\tName\t\t Type\n");
	for(i=0;i<j;i++)
   printf("%d\t%s\t\t%s\n",i+1,varpar[i].varname,varpar[i].vartype);
   fpout=fopen("output.txt","w");  //打开输出文件输出结果
    fprintf(fpout,"SN\tName\t\t Type\n");
	for(i=0;i<j;i++)
   fprintf(fpout,"%d\t%s\t\t%s\n",i+1,varpar[i].varname,varpar[i].vartype);
   fclose(fpout);               //
}


/*******************************************
 主函数
********************************************/
void main()
{           
   init();            /*初始化*/
   scanner();         /*扫描源程序*/
 order();			  //排列
  print();          //打印结果
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -