只过#4和#8求助
查看原帖
只过#4和#8求助
989792
lrx___楼主2024/12/1 10:10
#include <iostream>
#include <string>

std::string s,t,sta(" "),ans;

int main(){
	std::cin.tie(nullptr)->sync_with_stdio(false);
	for(;std::getline(std::cin,t);){
		s.append(t.begin(),t.end());
		s.push_back('\n');
	}
	std::string::iterator i,j;
	for(i=s.begin();i!=s.end();++i){
		if(*i=='['){
			for(j=i+1;j!=s.end()&&*j!=']';++j);
			t.assign(i+1,j);
			if(t=="h1"){
				ans.append("# ");
				sta.push_back('1');
				i=j;
			}else if(t=="h2"){
				ans.append("## ");
				sta.push_back('2');
				i=j;
			}else if(t=="i"){
				ans.push_back('*');
				sta.push_back('i');
				i=j;
			}else if(t=="b"){
				ans.append("__");
				sta.push_back('b');
				i=j;
			}else if(t=="quote"){
				if(ans.size()&&ans.back()!='\n'){
					ans.push_back('\n');
				}
				ans.append("> ");
				i+=7;
				for(;i!=s.end()&&*i=='\n';++i);
				if(i-s.begin()+8>=(int)(s.size())){
					ans.assign("Unclosed Mark\n");
					break;
				}
				for(;std::string(i,i+8)!="[/quote]";++i){
					if(i-s.begin()+8>=(int)(s.size())){
						ans.assign("Unclosed Mark\n");
						goto lb1;
					}
					ans.push_back(*i);
					if(*i=='\n'){
						ans.append("> ");
					}
				}
				for(;ans.size()&&ans.back()=='\n';ans.pop_back());
				if(ans.size()&&ans.substr(ans.size()-2)=="> "){
					ans.erase(ans.end()-2,ans.end());
				}
				ans.push_back('\n');
				i+=7;
			}else if(t=="/h1"){
				if(sta.back()!='1'){
					ans.assign("Match Error\n");
					break;
				}
				sta.pop_back();
				ans.append(" #");
				i=j;
			}else if(t=="/h2"){
				if(sta.back()!='2'){
					ans.assign("Match Error\n");
					break;
				}
				sta.pop_back();
				ans.append(" ##");
				i=j;
			}else if(t=="/i"){
				if(sta.back()!='i'){
					ans.assign("Match Error\n");
					break;
				}
				sta.pop_back();
				ans.push_back('*');
				i=j;
			}else if(t=="/b"){
				if(sta.back()!='b'){
					ans.assign("Match Error\n");
					break;
				}
				sta.pop_back();
				ans.append("__");
			}else if(t.size()>3&&t.substr(0,4)=="url="){
				++j;
				if(j-s.begin()+6>=(int)(s.size())){
					ans.assign("Unclosed Mark\n");
					break;
				}
				ans.push_back('[');
				for(;std::string(j,j+6)!="[/url]";++j){
					if(i-s.begin()+6>=(int)(s.size())){
						ans.assign("Unclosed Mark\n");
						goto lb1;
					}
					ans.push_back(*j);
				}
				ans.append("](");
				ans.append(t.substr(4));
				ans.push_back(')');
				i=j+5;
			}else if(t.size()>3&&t.substr(0,4)=="img="){
				++j;
				if(j-s.begin()+6>=(int)(s.size())){
					ans.assign("Unclosed Mark\n");
					break;
				}
				ans.append("![");
				for(;std::string(j,j+6)!="[/url]";++j){
					if(i-s.begin()+6>=(int)(s.size())){
						ans.assign("Unclosed Mark\n");
						goto lb1;
					}
					ans.push_back(*j);
				}
				ans.append("](");
				ans.append(t.substr(4));
				ans.push_back(')');
				i=j+5;
			}else if(t=="/quote"||t=="/url"||t=="/img"){
				ans.assign("Match Error\n");
				break;
			}
		}else{
			ans.push_back(*i);
			if(ans.size()>1&&ans.substr(ans.size()-2)=="\n\n"){
				ans.pop_back();
			}
		}
	}
	if(sta.size()>1&&ans!="Match Error\n"){
		ans.assign("Unclosed Mark\n");
	}
	lb1:;
	std::cout<<ans;
	return 0;
}
2024/12/1 10:10
加载中...