将C语言注释转换成C++注释

将input.c中的C语言注释转换成C++注释output。

解题思路:C语言的注释用“/**/”,C++注释用“//”表示,通过无线状态机模来做这道题,首先将问题可能分成几个简单的小块:判断是否有‘/’,当有时,也要分成三种可能:‘/’后的那个字符是否是'/','*',如果是也分两种,如果不是则继续则跳过第一个'/',然后继续查找,找到“/*”时,说明是C语言风格,则继续找与“/*”相对应的“*/”如果找到则将'*'换成'/',然后跳转到未注释继续查找。如果是C++风格,则遇到'\n'时跳到不是注释,然后继续。下面是思路图:

代码实现:

#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#pragma warning( disable : 4996)
typedef enum State       //枚举把5中情况列举出来
{
	NOT_COMENT,     //不是注释
	MEBAY_COMENT,   //可能注释
	C_COMENT,       //C语言注释
	CPP_COMENT,     //C++注释
	MEBAYC_COMENT,  //可能C语言注释
}State;
enum State state=NOT_COMENT;
int ch;
int main(){
	FILE *PIN;
	FILE *POUT;
	PIN = fopen("input.c", "r");    //打开文件
	if (PIN==NULL){
		perror("in: ");
		system("pause");
		return 1;
	}
	POUT = fopen("output", "w");    //写入的文件
	if (POUT == NULL){
		perror("out:");
		system("pause");
		return 1;
	}
		while ((ch = fgetc(PIN)) != EOF){
			switch (state)
			{
			case NOT_COMENT:
			{
				 if (ch == '/'){
				 fputc(ch, POUT);
				 state = MEBAY_COMENT;
								  
				   }
				   else{
				       state = NOT_COMENT;
				       fputc(ch, POUT);
				 }

			}break;
			case MEBAY_COMENT:
			{
				 if (ch == '/'){
				    fputc(ch, POUT);
				    state = CPP_COMENT;
				 }
				 else if (ch == '*'){ 
				    fputc('/', POUT);
				    state = C_COMENT;
				 }
				 else
				 {
				     fputc(ch, POUT);
				     state = NOT_COMENT;
				 }
                        }break;
			case C_COMENT:
			{

				 if (ch == '*')
				     state = MEBAYC_COMENT;
				 else{
					 state = C_COMENT;
					 fputc(ch, POUT);
					 if (ch == '\n') 
					 fprintf(POUT, "//");   //如果C语言注释为多行注释,那么换行时,要给需要注释的前面加上C语言风格注释
				 }
		       } 
			}break;
			case CPP_COMENT:
			{
				if (ch == '\n'){
					fputc(ch, POUT);
					 state = NOT_COMENT;
				  }
				 else
				  {
                                     fputc(ch, POUT);
				    state = CPP_COMENT;
				 }			  
			}break;
			case MEBAYC_COMENT:
			{
				  if (ch == '/') {
                                             state = NOT_COMENT;
					     int nextCh = fgetc(PIN);
				  if (nextCh != '\n') {
					    fputc('\n', POUT);
				    }
				     ngetc(nextCh, PIN);
			            }
				  else if (ch == '*') {
					  state = MEBAYC_COMENT;
					  fputc('*', POUT);
				 }
				 else {
				          state = C_COMENT;
					  fputc('*', POUT);
					  fputc(ch, POUT);
				   }			
			}break;
			}
	}
	fclose(PIN);
	fclose(POUT);
	system("pause");
}

猜你喜欢

转载自blog.csdn.net/qq_41889292/article/details/80636037
今日推荐