註釋轉換小項目(c註釋->到c++註釋)

首先歡迎閱讀本文,註釋轉換小項目涉及到c語言對文件的操作,另外這個小項目還應該對各種情況都考慮到。將c語言註釋轉換爲c++註釋

經過分析思考,我得到證據要的註釋轉換有以下幾類:我將之整理並放入一個文件裏,起名input.c

//1.一般情況
/* int i=0;*/

//2.換行問題
/* int i=0;*/int j = 0;
/* int i=0 */
int j = 0;

//3.匹配問題
/* int i=0;/*xxxxxxx*/

//4.多行註釋
/*
int i=0;
int j=0
int k=0;
*/int f = 0;

//5.連續註釋問題
/**//**/

//6.連續的**/問題
/***/

//7.C++註釋問題
//  /*xxxxxxxxxxxxxxx*/

通過C語言代碼對其進行註釋轉換,並輸出到另一個文件裏,我起名爲output.c,

之所以起名後綴爲.c 是爲了打開方便,當然也可起名後綴爲.txt,.doc等等

程序代碼如下:

頭文件(函數定義):AnnotationConversion.h

#pragma once

#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
#include<errno.h>

typedef enum Srate
{
	C_BEGIN,
	C_END,
}Srate;

void Convert(FILE *fIn, FILE *fOut);
void AnnotationConversion(const char* inputFile,
											const char* outputFile);

實現文件(測試函數):

#include"AnnotationConversion.h"

void Convert(FILE *fIn, FILE *fOut)  //打開文件
{
	char first, second;
	Srate tag = C_END;
	assert(fIn);
	assert(fOut);
	do
	{
		first = fgetc(fIn);
		switch (first)
		{
		case '/':
			second = fgetc(fIn);
			if ('*' == second)
			{
				//3.匹配問題
				if (tag == C_END)
				{
					fputc('/', fOut);
					fputc('/', fOut);
					tag = C_BEGIN;
				}
				else
				{
					fputc('/', fOut);
					fputc('*', fOut);
				}
			}
			else if ('/' == second)    //C++註釋問題
			{
				char next;
				fputc('/', fOut);
				fputc('/', fOut);
				do
				{
					next = fgetc(fIn);
					if (EOF == next)
					{
						break;
					}
					else
						fputc(next, fOut);
				} while (('\n' != next) && (EOF != next));

			}
			else
			{
				fputc(first, fOut);
				fputc(second, fOut);
			}
			break;
		case'\n':
			fputc('\n', fOut);
			if (tag == C_BEGIN)  	//4.多行註釋問題
			{
				fputc('/', fOut);
				fputc('/', fOut);
			}
			break;
		case '*':
			second = fgetc(fIn);
			if (second == '/')
			{
				// 2.換行問題
				char next = fgetc(fIn);
				if (EOF == next)
				{
					fseek(fIn, -1, SEEK_CUR);
				}
				//5.連續註釋問題
				else if ('/' == next)
				{
					fputc('\n', fOut);
					fseek(fIn, -1, SEEK_CUR);
				}
				else if (('\n' != next) && (EOF != next))
				{
					fputc('\n', fOut);
					fputc(next, fOut);
				}
				else
					fputc('\n', fOut);
				tag = C_END;
			}
			else if ('*' == second)     //6.連續的**/問題
			{
				fputc(first, fOut);
				fseek(fIn, -1, SEEK_CUR);
			}
			else
			{
				fputc(first, fOut);
				fputc(second, fOut);
			}
			break;
		default:
			if (EOF == first)
				break;
			fputc(first, fOut);
			break;
		}
	} while (first != EOF);

}

void AnnotationConversion(const char* inputFile,
	const char* outputFile)
{
	FILE * fOut, *fIn;
	fIn = fopen(inputFile, "r");
	if (fIn == NULL)
	{
		printf("打開文件%s失敗!errno:%d\n", inputFile, errno);
		return;
	}
	fOut = fopen(outputFile, "w");
	if (fOut == NULL)
	{
		fclose(fIn);
		printf("打開文件%s失敗!errno:%d\n", inputFile, errno);
		return;
	}
	Convert(fIn, fOut);
	fclose(fIn);
	fclose(fOut);
}

int main()
{
	AnnotationConversion("input.c","output.c");
	system("pause");
	return 0;
}

結果如下:原本output.c文件裏啥也沒有,運行程序之後結果如下:

//1.一般情況
// int i=0;

//2.換行問題
// int i=0;
int j = 0;
// int i=0 
int j = 0;

//3.匹配問題
// int i=0;/*xxxxxxx

//4.多行註釋
//
//int i=0;
//int j=0
//int k=0;
//
int f = 0;

//5.連續註釋問題
//
//

//6.連續的**/問題
//*

//7.C++註釋問題
//  /*xxxxxxxxxxxxxxx*/

測試結果無誤,限於本人目前水平,只能寫出如上代碼,帶有進步之時,定會再做修改,如果那位發現了問題,懇請對我提出批評指正,謝謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章