?? varparse.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 + -