思路:
- 题目考察对字符串的操作,使用string头文件中cin.getline()可以对于一行字符串进行输入,也可以保证空行的输入
- 每一行给定的相对位置都是对初始路径的操作,所以在循环前先保存初始路径,再对每一种情况进行判断
- 检查是否会有多余的// ,检查到多余的/可以直接使用erase删除
- 检查/./ ,相当于是/,所以可以删除掉前两个元素或者后两个元素
- 检查/…/ ,对于这个符号需要判断它的位置,如果它处于字符串的首部,那它相当于是一个/;如果它不在串首,那相当于没有,通过rfind函数寻找到/的位置然后将这一段删除即可
- 检查末尾是不是有/,/出现在末尾没有意义,可以直接删除
- 代码得分八十分,思路比较好理解,但是实在不知道 为什么最后两个点会错…
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int p;
cin>>p;
string origin;//给定的初始路径
cin>>origin;
getchar();
for(int i=0;i<p;i++)
{
string s;
//cin.getline(s);
getline(cin,s);
int loc;
if(s[0]!='/')//判断是不是相对路径
s=origin+'/'+s;
if(s[0]=='/0')//输入为空
s=origin;
while((loc=s.find("//")!=-1))//检查是否有多余的/
{
int count=2;
while(s[loc+count]=='/')
{
count++;
}
s.erase(loc,count-1);
}
while((loc=s.find("/./"))!=-1)///./相当于/
s.erase(loc+1,2);
while((loc=s.find("/../"))!=-1)
{
if(loc==0)//刚开始就是这.只需要留/
s.erase(loc+1,3);
else
{
int loc1=s.rfind("/",loc-1);//string::rfind
s.erase(loc1,loc-loc1+3);
}
}
if(s.size()>1&&s[s.size()-1]=='/')
s.erase(s.size()-1);
cout<<s<<endl;
}
return 0;
}