1. 程式人生 > >OpenJudge-去除C程式中的註釋

OpenJudge-去除C程式中的註釋

  • OpenJudge-去除C程式中的註釋


  • 題目連結:

2:去除C程式中的註釋

  • 思路:

註釋方式只有一種: /*    .....     */  且不能巢狀註釋

所以分三種情況:

1.當前字元不在註釋或字串中,如果不是註釋或字串標記符,直接輸出,否則改變狀態(註釋中/字串中)

2.字元在註釋中:檢查字元是否能構成 ”  */  “  ,如果是,註釋狀態解除,否則註釋中的字元不輸出

3.字元在字串中:檢查字元是否為   ‘ ”  ’  ,並且!!前面不得是  //” ,正常輸出

坑:

其實最坑是在字串中,涉及轉義字元 //,如果 ” 前有轉義字元,那麼該字元 ” 也是字串的一部分

  • 程式碼:

#include<iostream>
#include<string>
#include<cstring>
using namespace std;

string Str, Str_Plus;

int In_Str , In_Node ;

int main()
{
	while (getline(cin, Str))
		Str_Plus += Str + '\n';
	int Index = 0;
	
	while (Index != Str_Plus.size() - 1)
	{
		//不在註釋也不在字串中
		while (!In_Node && !In_Str&&Index < Str_Plus.size() - 1)
		{
			//註釋開始符
			if (Str_Plus[Index] == '/'&&Str_Plus[Index+1] == '*')
			{
				In_Node = 1;
				Index += 2;
			}
			//字串開始符
			else if (Str_Plus[Index] != '\\'&&Str_Plus[Index + 1] == '"')   //遇到轉義字元直接輸出就ok
			{
				In_Str = 1;
				cout << Str_Plus[Index] << Str_Plus[Index + 1];
				Index += 2;
			}
			else
				cout << Str_Plus[Index++];
		}


		//在字串中,要判斷結尾,如果雙引號前是 \\ 則不是結尾
		while (In_Str&&Index < Str_Plus.size() - 1)
		{
			if (Str_Plus[Index] == '\\'&&Str_Plus[Index + 1] == '"')
			{
				cout << Str_Plus[Index] << Str_Plus[Index + 1];
				Index += 2;
			}

			//真正結尾標誌
			else if (Str_Plus[Index] == '"')
			{
				In_Str = 0;
				cout << Str_Plus[Index++];

			}
			else
				cout << Str_Plus[Index++];
		}

		//在註釋中,只遍歷不輸出直到註釋結束
		while (In_Node&&Index < Str_Plus.size() - 1)
		{
			if (Str_Plus[Index] == '*'&&Str_Plus[Index + 1] == '/')
			{
				In_Node = 0;
				Index += 2;
			}
			else
				Index++;
		}
	}
	return 0;
}