问题描述:用C语言写的源程序是一种文本文件。本项目以C语言的源程序为操作对象,完成对源程序的一系列处理,如判断是否有main函数、将某些行加上注释等。各功能作为程序中的模块。
(1)读入一个C程序,判断其中是否只有一个main()函数,输出“暂时没有发现问题”,或者“没有main()函数”,,或者“不能定义多个main()函数”。
提示1:简单处理,可以只比较判断“main()”,考虑实际上的多个各种可能,main后面的括号中有任意多个空格及void的都应该计算在内。建议按最贱单的情况处理。
提示2:建议设计一个函数is_sub_string(char * s1,char * s2),函数用于判断s1是否“包含”在读入的一行s2中。调用时,用“main()”与读到的代码与字符串进行比较,形参s1对应的实参用
“main()”
即可。这样提升了“抽象”的级别,更容易实现,对应更高的代码质量。
(2)读入一个C语言程序,使程序中的所有左大括号“{”和右大括号“}”都单独占一行修改后的程序保存到另一个.c文件中,并在屏幕上显示处理过的程序,显示时加上行号。
(3)读入一个C语言程序,读入m,n两个数字,从第m行起的n行代码将作为注释使用(即在这些行前面加上“//”),修改后的程序保存在另一个.c文件中,并在屏幕上显示处理过的程序,显示时
加上行号。
作者:何知令
(1)读入一个C程序,判断其中是否只有一个main()函数,输出“暂时没有发现问题”,或者“没有main()函数”,,或者“不能定义多个main()函数”。
提示1:简单处理,可以只比较判断“main()”,考虑实际上的多个各种可能,main后面的括号中有任意多个空格及void的都应该计算在内。建议按最贱单的情况处理。
提示2:建议设计一个函数is_sub_string(char * s1,char * s2),函数用于判断s1是否“包含”在读入的一行s2中。调用时,用“main()”与读到的代码与字符串进行比较,形参s1对应的实参用
“main()”
即可。这样提升了“抽象”的级别,更容易实现,对应更高的代码质量。
(2)读入一个C语言程序,使程序中的所有左大括号“{”和右大括号“}”都单独占一行修改后的程序保存到另一个.c文件中,并在屏幕上显示处理过的程序,显示时加上行号。
(3)读入一个C语言程序,读入m,n两个数字,从第m行起的n行代码将作为注释使用(即在这些行前面加上“//”),修改后的程序保存在另一个.c文件中,并在屏幕上显示处理过的程序,显示时
加上行号。
作者:何知令
完成时间:2017年4月22日
/*
问题描述:用C语言写的源程序是一种文本文件。本项目以C语言的源程序为操作对象,完成对源程序的一系列处理,如判断是否有main函数、将某些行加上注释等。各功能作为程序中的模块。
(1)读入一个C程序,判断其中是否只有一个main()函数,输出“暂时没有发现问题”,或者“没有main()函数”,,或者“不能定义多个main()函数”。
提示1:简单处理,可以只比较判断“main()”,考虑实际上的多个各种可能,main后面的括号中有任意多个空格及void的都应该计算在内。建议按最贱单的情况处理。
提示2:建议设计一个函数is_sub_string(char * s1,char * s2),函数用于判断s1是否“包含”在读入的一行s2中。调用时,用“main()”与读到的代码与字符串进行比较,形参s1对应的实参用
“main()”
即可。这样提升了“抽象”的级别,更容易实现,对应更高的代码质量。
(2)读入一个C语言程序,使程序中的所有左大括号“{”和右大括号“}”都单独占一行修改后的程序保存到另一个.c文件中,并在屏幕上显示处理过的程序,显示时加上行号。
(3)读入一个C语言程序,读入m,n两个数字,从第m行起的n行代码将作为注释使用(即在这些行前面加上“//”),修改后的程序保存在另一个.c文件中,并在屏幕上显示处理过的程序,显示时
加上行号。
作者:何知令
完成时间:2017年4月22日
*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp1,*fp2,*fp3;//文件指针
int i;//用作循环
int right,have=0;//用作循环出口
char judge[10]= {"ain()"}; //用于判断与文件字符串比较
char ch,C,M[10];//读出的字符和若读出m则往后读的5个字符存储位置
printf("**************************************************\n");
printf("第一部分:\n");
if((fp1=fopen("main.txt","r"))==NULL)
{
printf("cannot open main.txt!");
exit(1);
}
while((ch=fgetc(fp1))!=EOF)
{
if(ch=='m')//找到m字符
{
for(i=0; i<5; i++)
{
M[i]=fgetc(fp1);//往后记录其后五个字符
}
right=0;//初始化符合的字符数
for(i=0; i<5; i++)
{
if(judge[i]==M[i])//判断对应字符是否正确
right++;
}
if(right==5)//若全对,则“有”++
have++;
}
}
if(have==0)
printf("没有main()函数\n");
if(have==1)
printf("暂时没有发现问题\n");
if(have>1)
printf("不能定义多个main()函数\n");
rewind(fp1);//把文件指针移回文件头
printf("**************************************************\n");
printf("第二部分:\n");
if((fp2=fopen("C.txt","w+"))==NULL)
{
printf("cannot open C.txt!");
exit(1);
}
C='\0';
while((ch=fgetc(fp1))!=EOF)
{
if((ch=='{'||ch=='}')&&C!='\n')//若当前字符为括号,且前一字符为换行,加入换行
fputc('\n',fp2);
else if((ch!='\n')&&(C=='{'||C=='}'))//若前一字符为括号,且当前字符不为换行,加入换行
{
fputc('\n',fp2);
for(i=0; i<3; i++) //增加的点,开始做时发现换行后不太像编译后的源程序,加入三个空格使之更接近编码规范
fputc(' ',fp2);
}
fputc(ch,fp2);//把当前读入的符号输出文件
C=ch;//记录前一读入的字符
}
rewind(fp2);//把文件指针移回文件头
printf("1.");
i=2;
while((ch=fgetc(fp2))!=EOF)
{
printf("%c",ch);
if(ch=='\n')
{
printf("%d.",i);
i++;
}
}
printf("\n");
rewind(fp1);
fclose(fp2);
printf("*************************************************\n");
int m,n;
int line=1;
printf("第三部分:\n");
scanf("%d %d",&m,&n);
if((fp3=fopen("d.txt","w+"))==NULL)
{
printf("cannot open c.txt!");
exit(1);
}
if(m==1)//若第一行就要求加入,没有‘/n’判断只能直接加
{
fputc('/',fp3);
fputc('/',fp3);
}
while(1)
{
ch=fgetc(fp1);//遍历每一个字符
fputc(ch,fp3);//将相应字符输出到另一个文件中
if(ch==EOF)//循环结束条件
break;
if(ch=='\n')
line++;
if(line>=m&&line<m+n)
{
if(ch=='\n')
{
fputc('/',fp3);
fputc('/',fp3);
}
}
}
rewind(fp3);
printf("处理过的源代码为:\n");
printf("1.");
i=2;
while((ch=fgetc(fp3))!=EOF)
{
printf("%c",ch);
if(ch=='\n')
{
printf("%d.",i);
i++;
}
}
printf("\n");
printf("************************************************\n");
fclose(fp1);
fclose(fp3);
return 0;
}
程序执行结果展示:
知识点总结:文件,循环
学习心得:起初啥也不会,还是看老贺的代码才明白怎么做。。但只看了怎样进行的文件操作,其余的都是自己做的