问题描述
问题分析
题目有些复杂……且有点绕,不过不慌……我们一点一点来看
最简单的处理操作:
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;
}
}