试题编号: | 201604-3 |
试题名称: | 路径解析 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 在操作系统中,数据通常以文件的形式存储在文件系统中。文件系统一般采用层次化的组织形式,由目录(或者文件夹)和文件构成,形成一棵树的形状。文件有内容,用于存储数据。目录是容器,可包含文件或其他目录。同一个目录下的所有文件和目录的名字各不相同,不同目录下可以有名字相同的文件或目录。 输入格式 第一行包含一个整数 P,表示需要进行正规化操作的路径个数。 输出格式 共 P 行,每行一个字符串,表示经过正规化操作后的路径,顺序与输入对应。 样例输入 7 样例输出 /d2/d4/f1 评测用例规模与约定 1 ≤ P ≤ 10。 |
问题链接:CCF201604-3 路径解析
问题分析:就是处理 '.' 和 ‘..’ 的问题
程序说明:注意了解strtok函数的使用
提交后得100分的C++程序:
#include<stdio.h>
#include<iostream>
#include<string>
#include<cstring>
#include<vector>
using namespace std;
const int N=1000;
char a[N+1];
void spilt(vector<string> &v,char *s)
{
char *sp;
sp=strtok(s,"/");
while(sp){
v.push_back(sp);
sp=strtok(NULL,"/");
}
}
int main()
{
int p;
vector<string>sv;
string cur,s;
cin>>p>>cur;
getchar();
for(int i=1;i<=p;i++){
memset(a,'\0',sizeof(a));
sv.clear();
getline(cin,s);
if(s==""){ //处理空串
cout<<cur<<endl;
continue;
}
if(s[0]!='/')
s=cur+"/"+s;
for(int j=0;j<s.length();j++)
a[j]=s[j];
spilt(sv,a);
for(int k=0;k<(int)sv.size();k++){
if(sv[k]==".")
sv[k]="";
else if(sv[k]==".."){
sv[k]="";
int t;
for(t=k-1;t>0;t--)
if(sv[t]!=""){
sv[t]="";
break;
}
if(t==0)
sv[0]="/";
}
}
bool flag=false;
for(int t=0;t<(int)sv.size();t++)
if(sv[t]!="/"&&sv[t]!=""){
cout<<"/"<<sv[t];
flag=true;
}
if(!flag)
cout<<"/";
cout<<endl;
}
return 0;
}