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;
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值