CCF_201604-3_路径解析

  没有用stack来写,直接用了字符串和指针,过程有点复杂的。首先对读入的每一个路径,判断它是绝对路径或者相对路径,然后确定起始的路径,然后继续一位位的判断,"//","/../","/./"等多种情况,还需要考虑末尾有无"/"和是否为空行等等。

  当我把一切都写好了的时候,提交之后发现只有90分,苦思无果,然后仔细阅读来一下题目,发现题目没有排除文件名字为"..***"和".***"的情况,做了相应修改后再次提交终于满分了!泪牛满面~~

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

int main()
{
    char root[1005],each[2005];
    int n;
    scanf("%d",&n);
    getchar();
    gets(root);
    while(n--)
    {
        char ans[2005] = {0};
        gets(each);
        char *p1,*p2;
        if(each[0] != '/')
        {
            strcpy(ans,root);
            p1 = ans;
            while(*p1 != 0)     p1++;
            *p1 = '/';
            p2 = each;
        }
        else
        {
            p1 = ans;
            *p1 = '/';
            p2 = each;
        }
        while(*p2 != 0)
        {

            if(*p1 == '/' && *p2 == '.' && *(p2+1) =='.' && (*(p2+2) == '/' || *(p2+2) == 0))
            {
                if(p1 == ans)    {}
                else    while(*--p1 != '/');
                p2 += 2;
            }
            else if(*p1 == '/' && *p2 == '/')    p2++;
            else if(*p1 == '/' && *p2 == '.'  && (*(p2+1) == '/' || *(p2+1) == 0))    p2++;
            else    *++p1 = *p2++;
        }
        if(*p1 == '/' && p1 != ans)  *p1 = 0;
        else *(p1+1) = 0;
        puts(ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zhurb/p/5842267.html