路径解析
题目描述![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a3a9b20f3e40e4768fee8cdf79766b3b.png)
输入输出格式以及样例
思路
本题主要考察对题目意思的理解,理解题目就好做了。观察发现本题最主要的是删除多余的 / 以及 . 和 . . 。
本题我才用的字符串的输入方式,由于直接在源字符串上进行删除操作可能会对后面的字符串有所影响,并且相应的文件名之间肯定只有一个 / ,所以干脆只保存文件名,最后在输出的时候输出 / 即可。
如果所给的路径是相对路径,先把他转化为绝对路径再进行进行规整化,因为我们只保存文件名,与其在最开始单独把当前路径r的文件提取出来,不如一开始就加到字符串中一块提取,看起来也简洁。
我们提取出 / 之间的字符串,可能是文件名,我们直接保存到数组中,如果是 . 表示当前目录,不做处理,如果是 . . ,则删除数组最后一个,在多个连续 / 的情况,截取出来就是空字符串 ,不做任何处理,这样就能将文件名提取出来,最后输出即可。
一开始,我没有考虑到文件名中含有 . 的情况,遍历的时候遇到 . 会判断它的下一个是不是 . ,如果是就按 . . 处理了,结果一直是90分,卡了很久不知道为什么,后面改变策略,直接无差别提取就行了
代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
int p; cin >> p;
string r; cin >> r;
cin.ignore();
string s;
for (int i = 0; i < p; i++) {
getline(cin, s);
vector<string> v;
if (s[0] != '/') s = r + '/' + s;
for (int i = 0; i < s.size(); i++) {
string temp = "";
while (s[i] != '/' && i < s.size()) {
temp += s[i];
i++;
}
if (temp.size() == 0 || temp == ".")continue;
else if (temp == "..") {
if (!v.empty()) v.pop_back();
}
else
v.push_back(temp);
}
cout << "/";
for (int i = 0; i < v.size(); i++) {
if (i < v.size() - 1) cout << v[i] << "/";
else cout << v[i];
}
cout << endl;
}
return 0;
}