路径解析

路径解析

题目描述在这里插入图片描述

输入输出格式以及样例

在这里插入图片描述

思路

本题主要考察对题目意思的理解,理解题目就好做了。观察发现本题最主要的是删除多余的 / 以及 . 和 . . 。
本题我才用的字符串的输入方式,由于直接在源字符串上进行删除操作可能会对后面的字符串有所影响,并且相应的文件名之间肯定只有一个 / ,所以干脆只保存文件名,最后在输出的时候输出 / 即可。
如果所给的路径是相对路径,先把他转化为绝对路径再进行进行规整化,因为我们只保存文件名,与其在最开始单独把当前路径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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值