📄 cifafenxi.cpp
字号:
#include<iostream>
#include<conio.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#define N 50
#define M 500
using namespace std;
char *a[7]={"main","if","else","int","return","void","while"};
char *b[10]={"=","+","-","*","/","<","<=",">",">=","!="};
char *c[9]={"、",";",":","{","}","[","]","(",")"};
char scmp(char *str) /*此函数判断单词类型*/
{
int i;
for(i=0;i<6;i++)
{
if(strcmp(str,a[i])==0) /*strcmp是比较两个字符串的大小,两个字符串相同时返回0,第一个字符串大于第二个字符串时返回一个正值,否则返回负值.
比较两个字符串的算法是:逐个比较两个串中对应的字符,字符大小按照ASCII码值确定,从左向右比较,如果遇到不同字符,
所遇第一对不同字符的大小关系就确定了两个字符串的大小关系,如果未遇到不同字符而某个字符串首先结束,那么这个字
符串是较小的,否则两个字符串相等。*/
return '1';
}
if(isdigit(str[0]))
return '3';
for(i=0;i<9;i++)
{
if(strcmp(str,b[i])==0)
return '4';
}
for(i=0;i<8;i++)
{
if(strcmp(str,c[i])==0)
return '5';
}
if(!isalnum(str[0])) /*isalnum()函数当参数是数字或者字母的时候返回非0值,其它是0*/
return '5';
else return '2';
}
int main()
{
FILE *in,*out,*fp;
char ch,cha,buffer[N],*zhou[M];
int i=0,j=0,k;
if((in=fopen("source.txt","r+"))==NULL)
{
printf("source.txt can't open or doesn't exist...\n");
getch();exit(0);
}
if((out=fopen("output.txt","w+"))==NULL)
{
printf("output file can not open...\n");
getch();exit(0);
}
/**************************以下是核心代码区**************************/
while(!feof(in)) /*feof函数的功能是检测流上的文件结束符。一般格式为:feof(FILE * stream);
它是一个用于检测给定流的文件结束符的宏。如果设置了文件结束符,则文件读操作
将返回文件结束符,直到调用了rewind函数或文件关闭。如果在指定流上的最后一次输入
操作中检测到文件结束符,该函数将返回非0值,否则返回0。*/
{
ch=fgetc(in);
if(isalpha(ch)) /*如果首字符是字母,函数:isalpha,原型:int isalpha(int ch),用法:头文件加入#include <ctype.h>
,功能:判断字符c是否为英文字母,当c为英文字母a-z或A-Z时,在标准c中相当于使用“isupper(c)||islower(c)”
做测试,返回非零值,否则返回零。*/
{
while(isalnum(ch)&&(i<N)) /*函数:isalnum,头文件:ctype.h,功能:如果本函数的变元为字母或数字,它将返回非零值,否则返回零值。*/
{
buffer[i++]=ch;
ch=fgetc(in); /*函数名: fgetc,功 能: 从流中读取字符,用 法: int fgetc(FILE *stream);*/
}
if(i>=N)
{
printf("the string is too long...\n");
getch();exit(0);
}
buffer[i]='\0';
zhou[j++]=(char *)malloc(sizeof(char)*(strlen(buffer)+1));
strcpy(zhou[j-1],buffer);
i=0;
fseek(in,-1L,1); /*函数名: fseek,功 能: 重定位流上的文件指针,用 法: int fseek(FILE *stream, long offset, int fromwhere);
描 述: 函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset个字节的位置。
如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
返回值: 成功,返回0,否则返回其他值。*/
}
else if(isdigit(ch)) /*如果首字符是数字*/
{
while(isdigit(ch)&&(i<N))
{
buffer[i++]=ch;
ch=fgetc(in);
}
if(i>=N)
{
printf("the digit is too long...\n");
getch();exit(0);
}
buffer[i]='\0';
zhou[j++]=(char *)malloc(sizeof(char)*(strlen(buffer)+1));
strcpy(zhou[j-1],buffer);
i=0;
fseek(in,-1L,1);
}
else if(!isalnum(ch)) /*如果首字符既不是数字也不是字母的话*/
{
if(ch!='\n'&&ch!=' ')
{
if(ch=='>'||ch=='<'||ch=='!') /* 以下代码实现超前搜索 */
{
if((cha=fgetc(in))=='=')
{
buffer[i++]=ch;
buffer[i++]=cha;buffer[i]='\0';
zhou[j++]=(char *)malloc(sizeof(char)*3);
strcpy(zhou[j-1],buffer);
i=0;
}
else
{
buffer[i++]=ch;buffer[i]='\0';
zhou[j++]=(char *)malloc(sizeof(char)*2);
strcpy(zhou[j-1],buffer);
i=0;
fseek(in,-1L,1);
}
}
else if(ch=='+'||ch=='-'||ch=='&'||ch=='|'||ch=='=')
{
if((cha=fgetc(in))==ch)
{
buffer[i++]=ch;buffer[i++]=cha;buffer[i]='\0';
zhou[j++]=(char *)malloc(sizeof(char)*3);
strcpy(zhou[j-1],buffer); /*原型:extern char *strcpy(char *dest,char *src);用法:#include <string.h>
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。*/
i=0;
}
else
{
buffer[i++]=ch;buffer[i]='\0';
zhou[j++]=(char *)malloc(sizeof(char)*2);
strcpy(zhou[j-1],buffer);
i=0;
fseek(in,-1L,1);
}
}
else
{
buffer[i++]=ch;buffer[i]='\0';
zhou[j++]=(char *)malloc(sizeof(char)*2);
strcpy(zhou[j-1],buffer);
i=0;
}
}
}
}
/**************************以上是核心代码区**************************/
for(i=0;i<j-1;i++) /*输出到文件*/
{
puts(zhou[i]);
cha=scmp(zhou[i]);
fputc('(',out); /*函数名: fputc,功 能: 送一个字符到一个流中,用 法: int fputc(int ch, FILE *stream);*/
fputc(cha,out);
fputc(',',out);
fputs(zhou[i],out); /* 函数名: fputs,功 能: 送一个字符串到一个流中,用 法: int fputs(char *string, FILE *stream);*/
fputc(')',out);
fputc('\n',out);
}
getch();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -