1.解题思路
分情况进行讨论,通过find函数和erase函数去掉/./和多个/,以及最后一个字符是/且非根目录情况下去掉最后一个/,这样就能拿40分。
再处理包含相对路径的情况,判断输入是否是相对路径形式,若是则需要加上当前目录的字符串,不断查找/../的子串并删除前一个目录(因为/../表示上一级目录)
情况比较多,细节也比较多,特别注意输入用getline,不然无法读取空行的情况,只能拿90分。
2.满分代码
#include<iostream>
using namespace std;
int p;
string current,str;
void tran(string& str)//做到这步已经有40分
{
int start=0;
//去/./
while(1)
{
start=str.find("/./",start);
if(start==str.npos)break;
str.erase(start,2);
}
//去多个/
start=0;
while(1)
{
start=str.find("//",start);
if(start==str.npos)break;
str.erase(start,1);
}
//去最后一个/ (非根目录)
if(str.size()>1&&str[str.size()-1]=='/')
{
str.erase(str.size()-1);
}
}
void relative_to_absolute(string& str)
{
if(str[0]!='/')
str=current+'/'+str;
//处理/../
int num=str.find("/../");
while(num!=str.npos)
{
if(num==0)
str.erase(num,3);
else
{
int temp=str.rfind('/',num-1);
str.erase(temp,num+2-temp+1);
}
num=str.find("/../");
}
}
int main()
{
cin>>p;
cin>>current;
cin.ignore();
while(p--)
{
getline(cin,str); //cin>>str 只能拿90分 因为输入空行会出现问题
relative_to_absolute(str);
tran(str);
cout<<str<<endl;
}
return 0;
}