CSP2016-04-03 路径解析

问题描述

在这里插入图片描述

问题分析

题目有些复杂……且有点绕,不过不慌……我们一点一点来看
最简单的处理操作:
1、最后一个**/,代表的一定是一个目录,正规化操作去掉
2、包含多个
/,多余,直接删除,合并为一个
3、对于
.的处理,.表示本目录,这个符号会以/./的形式出现,合并为/,删除/.**
4、对于**…,这个可能有些难懂,分析一下:/…/出现,代表上一级目录,当命令执行到这里的时候提醒返回上一级目录,返回时需要删除当前目录,则遇到//…/**时,删除代表的当前目录,最后变为**/**
5、最后百分之四十的数据,可能包含相对路径,不以**/**开始,那我们先要根据相对路径的含义,表示从当前目录开始构建的路径,那我们就要先将当前目录加在给出的相对路径前变成绝对路径然后按照上面的限制规范化

代码块问题

1、知道一些string的基本函数用法,方便操作
2、关于string的读入这个真的好难……用cin读入的string类型数据,在读到空格的时候会停止读入,(网上其他好多种方法我也试过都失败了)那最后getline(cin,s)成功了,关于getline读入字符串(回车的疑惑)getline的其他注意点

但是又出现了另一个问题就是关于在输入int整形之后的那个回车符被读入作为了s变量的值,这时候要看关于getchar()的一些知识:关于getchar
不过在for循环中的getline在每次循环时并不需要用getchar吃掉上一次输入的回车(这个差异……我也不是很清楚为什么,可能是因为执行了for循环语句……)

#include<iostream>
#include<cstdio>
#include<string.h> 
using namespace std;

int main()
{
	int p,flag;
	string s,t;
	scanf("%d",&p);
	getchar();//报错点 
	getline(cin,s);
	for(int i=1;i<=p;i++)
	{
		getline(cin,t);//会读入换行符 
		//空字符串,正规化为当前目录 
		if(t.size()==0)
			t=s;
		//相对路径,不以/符号开头,表示从当前目录开始构建的路径 
		if(t[0]!='/')
		{
			t=s+'/'+t;
		//	cout<<t<<endl;
		}
		//去掉结尾的'/'
		while(t[t.length()-1]=='/'&&t.length()>1)
			t=t.substr(0,t.length()-1); 
		//去掉多余的'//'
		while((flag=t.find("//"))!=-1)
			t.erase(flag,1);
		//.表示本目录	
		while((flag=t.find("/./"))!=-1)
			t.erase(flag,2);
		//..表示上一级目录	
		while((flag=t.find("/../"))!=-1)
		{
			if(flag==0)//根目录为/,相对路径转换后开头为//../
				t.erase(flag,3);
			else
			{
			     int count=4;
			     while(flag>=1&&t[flag-1]!='/')
			     {
			     	flag--;
			     	count++;
				 }
				 t.erase(flag,count);
			}    	 
		}	
		cout<<t<<endl;		
	} 
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值