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

CCF CSP 201604-3 路径解析。c++_第1张图片
CCF CSP 201604-3 路径解析。c++_第2张图片
CCF CSP 201604-3 路径解析。c++_第3张图片
思路:

  • 题目考察对字符串的操作,使用string头文件中cin.getline()可以对于一行字符串进行输入,也可以保证空行的输入
  • 每一行给定的相对位置都是对初始路径的操作,所以在循环前先保存初始路径,再对每一种情况进行判断
  • 检查是否会有多余的// ,检查到多余的/可以直接使用erase删除
  • 检查/./ ,相当于是/,所以可以删除掉前两个元素或者后两个元素
  • 检查/…/ ,对于这个符号需要判断它的位置,如果它处于字符串的首部,那它相当于是一个/;如果它不在串首,那相当于没有,通过rfind函数寻找到/的位置然后将这一段删除即可
  • 检查末尾是不是有/,/出现在末尾没有意义,可以直接删除
  • 代码得分八十分,思路比较好理解,但是实在不知道 为什么最后两个点会错…
#include
#include
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;
}

你可能感兴趣的:(CCF,CSP)