课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/9078413
【项目4】写处理C++源代码的程序
(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 appear(char*s1,char*s2); int main( ) { char line[256]; char main_fun[8]="main()"; int main_num=0;//初时,尚未发现 //将文件中的数据读入到字符数组中 ifstream sourceFile("source.cpp",ios::in); //以输入的方式打开文件 if(!sourceFile) //测试是否成功打开 { cerr<<"source code read error!"<<endl; exit(1); } while(!sourceFile.eof()) { sourceFile.getline(line,255,'\n'); main_num+=appear(line,main_fun); if (main_num>1) //多于1个,没有必要再去读取 break; } sourceFile.close(); //识别结论 if(main_num==0) cout<<"error: no main()."; else if (main_num==1) cout<<"right: a main() be exist."; else cout<<"error: more than one main()."; cout<<endl; return 0; } //返回s2在s1中出现了几次 int appear(char*s1,char*s2) { int n=0,flag; char *p,*q; for(; *s1!='\0'; s1++) { if (*s2==*s1) /*判断字符串中是否有和要判断的字串首字符相同的字符*/ { flag=1; p=s1 ; /*s1 p 为第一个相同字符的地址*/ q=s2; for(; *q!='\0';) /*如果有则判断接下去的几个字符是否相同*/ { if (*q++!=*p++) { flag=0; break; } } if (flag==1) n++; } } return(n); }