第十四周项目4 - 处理C++源代码的程序(排查main())

在CodeBlocks等IDE中都提供了代码格式整理的功能。完成这种功能的程序,操作的数据是用C++写的源代码文件。C++源文件是一种文本文件,可以通过程序进行操作。
集成开发环境(IDE)对对程序进行编译,操作的“数据”是源程序。编译中,要对源程序进行词法检查和语法检查,后续还要进行目标代码生成、代码优化等工作。相关的技术将在《编译原理》课中学习。这些技术可以用在很多领域,当然也能够让我们对于编程语言有更深的了解。
  本项目将以C++源程序为操作对象,完成对源程序的一系列处理。各功能可以分别编制一个程序实现(建议用这种简单的方案),也可以将其集成在一起(向着自己做出IDE努力)。
(1)读入一个C++程序,判断其中是否只有一个main()函数,输出“暂时没有发现问题”,或者“没有main()函数”,或者“不能定义多个main()函数”;
提示1:简单处理,可以只比较判断”main()”,考虑实际上的各种可能,main后面的括号中有任意多个空格及void的都应该算在内。建议按最简单的情形处理。
提示2:建议设计一个函数,将读到的代码与字符串”main()”进行比较。函数用于判断s1是否“包含”在读入的一行s2中,调用时,形参s1处的实参用”main()”即可,这样写提升了“抽象”级别,更容易实现,对应更高的代码质量。

/*
 *Copyright(c)2014,烟台大学计算机学院
 *All rights reserved.
 *文件名称:test.cpp
 *作者:满星辰
 *完成日期:2015年 6月 9日
 *版本号:v1.0
 *
 */
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <cstring>
using namespace std;
int appear_int_main(char *l,char *c);
int main()
{
    char line[256];
    char cmain[8]="main()";
    int main_num=0;
    ifstream infile("source.cpp",ios::in);
    //测试是否成功打开,打开失败时(如要读的数据文件不存在)退出
    if(!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    while(!infile.eof())
    {
        infile.getline(line,255,'\n');
        main_num+=appear_int_main(line,cmain);
        if(main_num>1)
            break;
    }
    infile.close();          //读入完毕要关闭文件
    if(main_num==0)
        cout<<"没有main函数!"<<endl;
    else if(main_num==1)
        cout<<"正常!"<<endl;
    else
        cout<<"超过一个main函数!"<<endl;
    return 0;
}
int appear_int_main(char *l,char *c)
{
    char *p,*q;
    int num=0,flag;
    for(; *l!='\0'; l++)
    {
        if(*l==*c)
        {
            flag=1;
            p=l;
            q=c;
            for(;*q!='\0';)
            {
                if(*q++!=*p++)
                {
                    flag=0;
                    break;
                }
            }
            if(flag==1)
                ++num;
        }
    }
    return num;
}
图片:

第十四周项目4 - 处理C++源代码的程序(排查main())_第1张图片
心得:

不停地停止运行。。。按照贺老的程序一点一点改的,发现是设置字符串时设置的长度小了。。。

你可能感兴趣的:(第十四周项目4 - 处理C++源代码的程序(排查main()))