第十四周项目4-1:处理C++源代码的程序-查找main()函数

问题及代码:

/*
*Copyright (c)2015,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:project.cpp
*作    者:陈文青
*完成日期:2015年6月16日
*版 本 号:v1.0
*
*问题描述:(1)读入一个C++程序,判断其中是否只有一个main()函数,输出“暂时没有发现问题”,或者“没有main()函数”,或者“不能定义多个main()函数”;
提示1:简单处理,可以只比较判断”main()”,考虑实际上的各种可能,main后面的括号中有任意多个空格及void的都应该算在内。建议按最简单的情形处理。
提示2:建议设计一个函数,将读到的代码与字符串”main()”进行比较。函数用于判断s1是否“包含”在读入的一行s2中,调用时,形参s1处的实参用”main()”即可,这样写提升了“抽象”级别,更容易实现,对应更高的代码质量。
*程序输入:
*程序输出:
*/
#include <fstream>
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
int search_main(char*s);  //在q中查找main()字符

int search_main(char*s)
{
    char main[8]="main()";    //用作比较字符              //接受字符
    char *p,*q;               //检索main()所需指针
    int num=0;                //main()函数个数
    for(; *s!='\0'; s++)      //接受一行的字符
    {
        if(*s=='m')           //当出现第一个字符m时;
        {
            int i=1;
            p=main;           //对main取地址
            q=s;
            while(*q!='\0')
            {
                if(*q==' ')   ++q;      //跳过空格
                if (*q++!=*p++)     //当接下来的字符不正确的时候,结束循环,返回
                {
                    break;
                }
                ++i;
                if (i==6) ++num;       //当有六个字符串相同的时候,则含有一个main函数
            }
        }
    }
    return num;
}
int main( )
{
    char line[256];
    int main_num=0;//初时,尚未发现

    //将文件中的数据读入到字符数组中
    ifstream sourceFile("source.cpp",ios::in);  //以输入的方式打开文件
    if(!sourceFile)       //测试是否成功打开
    {
        cerr<<"找不到源代码!"<<endl;
        exit(1);
    }
    while(!sourceFile.eof())
    {
        sourceFile.getline(line,255,'\n');
        main_num+=search_main(line);
        if (main_num>1)  //多于1个,没有必要再去读取
            break;
    }
    sourceFile.close();

    //识别结论
    if(main_num==0)
        cout<<"没有main()函数。";
    else if (main_num==1)
        cout<<"暂时没有发现问题。";
    else
        cout<<"不能定义多个main()函数";
    cout<<endl;
    return 0;
}

运行结果:

知识点总结:

写了很多文件流的程序,文件流已经没有什么问题了。

所以关键是对main()函数的查找下功夫。

利用指针和  字符串main()进行比较。如果连续六个字符和main()字符串相同,那么num_main便+1,然后每行统计一次,便得到最后的结果

时间: 2024-10-01 02:29:33

第十四周项目4-1:处理C++源代码的程序-查找main()函数的相关文章

十四周 项目 1 动物这样叫

#include <iostream> #include <string> using namespace std; class Animal { public: virtual void cry() { cout<<"不知哪种动物,让我如何学叫?"<<endl; } }; class Mouse:public Animal { public: Mouse(string nam,char s):name(nam),sex(s) {} vo

第二十四周项目4-猴子选大王(约瑟夫问题)

一群猴子,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈.从第1只开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王.输入m和n,输出为大王的猴子是几号. 提示1:(1)链表解法:可以用一个循环的单链表来表示这一群猴子.表示结点的结构体中有两个成员:一个保存猴子的编号,一个为指向下一个人的指针,编号为m的结点再指向编号为1的结点,以此构成环形的链.当数到第n个时,该结点被删除,继续数,直到只有一个结点.(2)使用结构数组来表示

第十四周 项目三 电子词典

/* *Copyright (c)2014,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:d.cpp *作 者:张旺华 *完成日期:2015年6月3日 *版 本 号:v1.0 */ /*项目3-OOP版电子词典] 做一个简单的电子词典.在文件dictionary.txt中,保存的是英汉对照的一个词典,词汇量近8000个, 英文.中文释义与词性间用'\t'隔开. (1)编程序,由用户输入英文词,显示词性和中文释义. 提示1:如果要用OOP完成这个词典(当然也

第十四周项目3-OOP版电子词典

做一个简单的电子词典.在文件dictionary.txt中,保存的是英汉对照的一个词典,词汇量近8000个,英文.中文释义与词性间用'\t'隔开. (1)编程序,由用户输入英文词,显示词性和中文释义. 提示1:如果要用OOP完成这个词典(当然也可以用OO方法实现),可以定义一个Word类表示一个词条,其中的数据成员string english; 表示英文单词,string chinese;表示对应中文意思,string word_class;表示该词的词性:还可以定义一个Dictionary类,

第十四周 项目一 小玩文件

<span style="font-size:18px;">[项目1 - 小玩文件] (1)下面程序的功能是统计文本文件abc.txt中的字符个数,</span> <span style="font-size:18px;">#include <iostream> #include <cstdlib> #include <fstream>// //fstream提供了三个类,用来实现c++对文件的

第十四周项目3:OOP版电子词典

问题: /* *Copyright (c)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:project.cpp *作 者:陈文青 *完成日期:2015年6月17日 *版 本 号:v1.0 * *问题描述:做一个简单的电子词典.在文件dictionary.txt中,保存的是英汉对照的一个词典,词汇量近8000个,英文.中文释义与词性间用'\t'隔开. 编程序,由用户输入英文词,显示词性和中文释义. 提示1:如果要用OOP完成这个词典(当然也可以用O

二十四周项目一--哈希法存储与查找

哈希法: 实例: #include <iostream> using namespace std; int searchHash(int h[], int l, int key); void insertHash(int h[], int l, int data); int main() { const int hashLength = 13;//哈希表长度 int hashTable[hashLength]={0}; int m, n; //创建hash for (int i = 0; i

第十四周项目2:用文件保存的学生名单

问题及代码: /* *Copyright (c)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:project.cpp *作 者:陈文青 *完成日期:2015年6月16日 *版 本 号:v1.0 * *问题描述: (1)定义学生类,其中包含姓名.C++课.高数和英语成绩及总分数据成员. (2)用对象数组进行存储学生的成绩,读入成绩并计算总分:将总分高于平均总分且没挂科的同学的信息保存到文件pass_score.dat中. *程序输入: *程序输出:

二十四周项目二--回溯法之走迷宫

问题: 代码: #include <iostream> #include <iomanip> #include <cstdlib> using namespace std; #define MaxSize 100 int maze[10][10] = //定义一个迷宫,0表示通道,1表示墙 { {1,1,1,1,1,1,1,1,1,1}, {1,0,0,1,1,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,1,0,0,1