在我们写代码是有时要注释,所以很多时候,我们都是ctrl+k+c.既然常常用到,我们不妨写写看看它是怎么转换的。一方面提高编程能力,另一方面,也可以提高自身的的思考和处理问题的能力。
首先,我们来思考注释转换一个有多少问题。
1.一般情况
/* int i = 0; */
// 2.换行问题
/* int i = 0; */int j = 0;
/* int i = 0; */
int j = 0;
// 3.匹配问题
/*int i = 0;/*xxxxx*/
// 4.多行注释问题
/*
int i=0;
int j = 0;
int k = 0;
*/int k = 0;
// 5.连续注释问题
/**//**/
// 6.连续的**/问题
/***/
// 7.C++注释问题
// /*xxxxxxxxxxxx*/
// 8.C注释本身不匹配
/* int i = 0;
大概,就这些吧。一看八个问题,可能有些头大。这么多问题怎么才能解决呢?
我们可以一个一个的解决,分布解决
.h
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<errno.h>
.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include"AnnotationConver.h"
typedef enum State
{
C_BEGIN,
C_END,
}State;
void Conver(FILE* put, FILE* Out)
{
char frist, second;
State tag = C_BEGIN;
assert(put);
assert(Out);
do
{
frist = fgetc(put);
switch (frist)
{
case '/':
second = fgetc(put);
if(second == '*' && tag == C_BEGIN) // 3.匹配问题
{
fputc('/',Out);
fputc('/',Out);
tag = C_END;
}
else
{
fputc(frist,Out);
fputc(second,Out);
if(second == '/')
{
char nextch;
do
{ nextch = fgetc(put);
fputc(nextch, Out);
} while (nextch != '\n' && nextch != EOF);
}
}
break;
case'*':
second = fgetc(put);
if(second == '/')
{
/*if(tag == C_BEGIN)
{
fputc('\n',Out);
tag = C_BEGIN;
}
else if (tag == C_DD)
{
fputc(frist,Out);
fputc(second,Out);
}*/
char nextch ;
fputc('\n', Out);
tag = C_BEGIN;
nextch = fgetc(put);
if (nextch == '/')
{
fseek(put, -1, SEEK_CUR);
}
else if (nextch != '\n')
{
fputc(nextch, Out);
}
}
else //连续的**/问题
{
fputc(frist,Out);
fseek(put,-1,SEEK_CUR);
}
break;
case '\n': // 4.多行注释问题
/*second = fgetc(put);
if(second == EOF)
{
break;
}*/
if(tag == C_END)
{
fputc('\n',Out);
fputc('/',Out);
fputc('/',Out);
}
/*else if(tag == C_BEGIN)
{
fputc(frist,Out);
}*/
break;
default:
fputc(frist,Out);
break;
}
}while(frist != EOF );
}
void Annotationconver(const char* putfile, const char* Outfile)
{
FILE* put, *Out;
put = fopen(putfile,"r");
if(put == NULL)
{
printf("打开文件%s失败,errno:%d\n",putfile,errno);
}
Out = fopen(Outfile,"w");
if(Out == NULL)
{
printf("打开文件%s失败,errno:%d\n",Outfile,errno);
}
Conver(put, Out);
fclose(put);
fclose(Out);
}
int main()
{
Annotationconver("input.c","output.c");
system("pause");
return 0;
}
以上便是,本人自己写出来的,在我们一个接一个解决问题的时候,有时候,在解决第三个问题时,第四个问题也得以解决,或者解决后一个问题时,影响到后一个问题。所以我们要学会思考和调试。从而方便与我们解决问题和实现功能。