CCF CSP 201604-3 路径解析。c++

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:

  • 题目考察对字符串的操作,使用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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值