65,210
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main(int argc,char * argv[]){
FILE * inputFile, * outputFile;//定义输入输出文件
char c,c2;
inputFile = stdin; //先把键盘输入作为文件输入
outputFile = stdout; //先把屏幕输出作为文件输出,也就是说,你运行程序是没有加参数,那么结果就是使用键盘和屏幕
for(int i = 1;i < argc;i++){//处理命令行参数
switch(argv[i][1]){ //判断参数的类型
case 'i': //为输入文件名
if(inputFile == stdin || inputFile == NULL){
printf("Input File :%s\n",argv[i] + 2);
inputFile = fopen(argv[i] + 2,"r"); //设置文件输入
}
break;
case 'o': //为输出文件名
if(outputFile == stdout || outputFile == NULL){
printf("Output File :%s\n",argv[i] + 2);
outputFile = fopen(argv[i] + 2,"w"); //设置文件输出
}
break;
default:
fprintf(stderr,"不可识别的参数[%d] : %s\n",i,argv[i]);
break;
}
}
if(inputFile == NULL || outputFile == NULL){
fprintf(stderr,"指定的文件未找到\n");
exit(-1); //没有找到指定文件,程序直接结束
}
while(!feof(inputFile)){ //当还没有读到文件结束时
c = fgetc(inputFile); //读入一个字符
if(c == EOF)break; //读到文件结束,跳出循环
if(c == '"'){//处理字符串
fputc(c,outputFile);
while(!feof(inputFile)){
c = fgetc(inputFile);
if(c == '\\'){ //处理两个\的注释
fputc(c,outputFile);
fputc(fgetc(inputFile),outputFile);
continue;
}
fputc(c,outputFile);
if(c == '"')break;
}
continue;
}
if(c == '/'){ //处理/* */型的注释
c2 = fgetc(inputFile);
if(c2 == '/'){//“//”注释
for(c2 = fgetc(inputFile); c2 != '\n' && c2 != EOF;c2 = fgetc(inputFile));
}else if(c2 == '*'){//“/* */”注释
for(c2 = fgetc(inputFile); c2 != EOF;c2 = fgetc(inputFile)){
if(c2 == '*' && fgetc(inputFile) == '/')break;
}
}else{//非注释
fputc(c,outputFile);
fputc(c2,outputFile);
}
continue;
}
fputc(c,outputFile); //输出非注释的部分
}
//关闭文件
if(stdin != inputFile && inputFile != NULL)fclose(inputFile);
if(stdout != outputFile && outputFile != NULL)fclose(outputFile);
}