任务和代码:
编写一个程序并取名test.c,统计该文件中出现”if”,”while”,”for”的次数。
/*
*Copyright (c) 2016, CSDN学院
* All rights reserved.
* 文件名:main.c
* 作者:DylanLiu
* 完成日期:2016/15/8
* 版本号:V1.0
*
* 问题描述:一个c语言的简单的编译器。
* 程序输出:。
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int appear(char *s1, char *s2);
int main(void)
{
char line[256];
int if_num=0;
int while_num=0;
int for_num=0;
FILE *fp=fopen("source.c", "r");
if(fp==NULL){
printf("\aError! can't open the file!\n\n");
exit(1);
}
while(!feof(fp)){
fgets(line, 256, fp);
if_num += appear(line, "if");
for_num += appear(line, "for");
while_num += appear(line, "while");
}
fclose(fp);
printf("while:%d\nif:%d\nfor:%d\n", while_num, if_num, for_num);
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);
}
读入一个C程序,使程序中的所有左花括号“{”和右花括号“}”都单独占一行,新程序保存到另一个.c文件中,并在屏幕上显示处理过的程序,显示时加上行号。
/*
* Copyright (c) 2016, CSDN学院
* All rights reserved.
* 文件名:main.c
* 作者:DylanLiu
* 完成日期:2016/12/8
* 版本号:V1.0
*
* 问题描述:格式化C语言的代码中的{ }并各在单独的一行输出,显示各行代码的行号。
* 程序输出:带有行号的C语言源代码,并且{ }各占一行输出。
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define NUM 256*1024
void formate(char *file1, char *file2);
void print(char *file0);
int main(void)
{
formate("aftergshc.c", "gshc.c");
printf("After formate:\n");
print("aftergshc.c");
return 0;
}
//将file2中的内容格式化,并将结果存到file1中
void formate(char *file1, char *file2)
{
char *p, *q;
char ch1='\0', ch2='\0';
int i=0;
FILE *fp1=fopen(file2, "r");
FILE *fp2=fopen(file1, "w");
if(fp1==NULL){
printf("\aError! can't open the file\n\n");
exit(1);
}
if(fp2==NULL){
printf("\aError! can't open the file\n\n");
exit(1);
}
while(!feof(fp1)){ //当没有达到文件尾部时一直输出
ch2=fgetc(fp1); //将当前的字符赋值给ch2
if( (ch2=='{' || ch2=='}') && (ch1 != '\n') ){ //如果当前读到的字符是{ 或 },且该符号之前没有换行符
fputc('\n',fp2); //将换行符加入到{ 或 }的前面
}
else if( (ch1=='{' || ch1=='}') && (ch2 != '\n') ){ //当有{ 或 }出现时,其后没有\n,时加入\n(如:....} return 0;)
fputc('\n', fp2);
}
fputc(ch2, fp2); //将修改或不修改的内容都要写入到file1中
ch1=ch2; //将读到的字符都下移一位
}
fclose(fp1);
fclose(fp2);
}
//输出file0中的内容
void print(char *file0)
{
char str[NUM];
int n=1;
FILE *fp=fopen(file0, "r");
if(fp==NULL){
printf("\aError! can't open this file!\n\n");
exit(1);
}
while (!feof(fp)){
fgets(str, NUM, fp);
printf("%d\t%s\n", n, str);
n++;
}
fclose(fp);
}
/*****************有待完善****************/
缺点:
{ 和 }配对时太别扭,很难分清配对情况(有待改进的地方还有很多很多)