在我们写代码是有时要注释,所以很多时候,我们都是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;
}

以上便是,本人自己写出来的,在我们一个接一个解决问题的时候,有时候,在解决第三个问题时,第四个问题也得以解决,或者解决后一个问题时,影响到后一个问题。所以我们要学会思考和调试。从而方便与我们解决问题和实现功能。