题目就不赘述了,上一篇是未完善版,这一版终于改好啦!!!
看了好久才发现之前的局限在哪了,因为读入数据的问题没有处理好,导致空行输入时,不能正确读取,进而结果错误。
分析一下我的个人思路:
我直接使用了vector容器存储路径中的各级(我把路径处理成级别形式),遇到文件或目录就直接存储,“.”则不作处理,“…”退一级(借助vector容器的pop_back(函数))。
在处理路径前判断是绝对路径还是相对路径,绝对路径可以直接处理,相对路径则在容器中赋值当前目录,然后处理即可。
(其实两者处理的实质是一样的,为什么我用了两个函数呢?因为岗开始的思路就是这样,有没有再改,再就是考虑到使用substr()函数的参数时,相对路径从0开始,绝对路径从1开始,其实修改一下两个函数就可以合在一起使用了,我太懒了,就不再改了)
#include<iostream>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
using namespace std;
vector<string> par,v;
//处理绝对路径
void Absolute_way(string s){
for(int len=1;len<s.length();){
string str;
int pos=s.find("/",len);
//t处理特殊情况“///”
if(pos==len){
len++;
continue;
}
//获得/.../之间的字符串,进而进行处理
else if(pos!=string::npos){
str=s.substr(len,pos-len);
}
else{
str=s.substr(len,s.length()-len);
pos=s.length()-1;
}
if(str==".."){ //情况"/../"
if(v.size())
v.pop_back();
}
else if(str=="."){ //情况“/./”
}
else{
v.push_back(str);
}
len=pos+1;
}
}
//处理相对路径
void Resp_way(string s){
for(int i=0;i<par.size();i++){
v.push_back(par[i]);
}
for(int len=0;len<s.length();){
string str;
int pos=s.find("/",len);
if(pos==len){
len++;
continue;
}
else if(pos!=string::npos){
str=s.substr(len,pos-len);
}
else{
str=s.substr(len,s.length()-len);
pos=s.length()-1;
}
if(str==".."){
if(v.size())
v.pop_back();
}
else if(str=="."){
}
else{
v.push_back(str);
}
len=pos+1;
}
}
int main(){
int n;
cin>>n;
getchar();//读取回车符
string s;
char temp[1010];
gets(temp);//读取字符数组以回车符为标志
s=temp;
//处理当前目录(划分等级)
for(int len=1;len<s.length();){
int pos=s.find("/",len);
if(pos!=string::npos){
string p=s.substr(len,pos-len);
par.push_back(p);
len=pos+1;
}
else{
string p=s.substr(len,s.length()-len);
par.push_back(p);
len=s.length();
}
}
while(n--){
string str;
gets(temp);
if(strlen(temp)==0){//若路径为空字符串,则正规化操作的结果是当前目录。
for(int i=0;i<par.size();i++)
cout<<"/"<<par[i];
cout<<endl;
}
else{
str=temp;
if(str[0]=='/')
Absolute_way(str);
else
Resp_way(str);
if(v.size()){
for(int i=0;i<v.size();i++)
cout<<"/"<<v[i];
cout<<endl;
v.clear();
}
else //若处理完为根目录(即容器为空)则输出“/”
cout<<"/"<<endl;
}
}
return 0;
}