2016-4-3、路径解析

发布时间 2024-01-12 20:34:02作者: 不是孩子了

使用了stringstream流
getline函数,它有两种形式,一种是头文件< istream >中输入流成员函数;一种在头文件< string >中普通函数;

#include<iostream>
#include<string>
#include<sstream>
#include<vector>
using namespace std;

int main()
{

    int p;//要正规化路径的个数
    string cur;//当前路径
    cin>>p;
    cin>>cur;

    cin.get(); //用于吸收我们输入完毕后按的回车,因为我们下面使用了getline,如果不吸收这个回车,就会被getline吸收

    for(int i = 0; i<p; i++){
        vector<string> v;
        string str = "";
        getline(cin, str); //把字符串str输入到流中

        if(str=="") //如果输入的是空字符串,则输出的是当前路径
            str = cur;

        if(str[0]!='/') //将不以根目录开头的都加上当前目录
            str = cur + '/' + str;

        for(int j = 0; j<str.size(); j++){
            if(str[j] == '/')
                str[j] = ' ';
        }

        stringstream ss(str);//str放入流中

        //将所有的'/'都换为空格,因为当字符串中含有空格时,或者使用getline函数读取一行字符串后进行按照空格分割成字串时,可以使用stringstream进行分割
        //然后将按空格分隔的流依次输入到word字符串中
        string word;
        while(ss>>word){ 
            if(word=="."){ //当前目录,不用管
                continue;
            }else if (word==".." && !v.empty()) //上一层目录,直接删除vector的最后一个元素即可
            {
                v.pop_back();
            }else if(word!=".."){ //否则就入栈, 同时避免有多个“..”连续且vector为空的情况
                v.push_back(word);
            } 
        }

        if(v.size()==0){ //输入字符串全是/,此时由于stringstream以空格分隔,故vector大小为0
            cout<<"/"<<endl;
            continue;
        }

        for(int j = 0; j<v.size(); j++){
            if(j==0)
                cout<<"/";
            cout<<v[j];
            if(j!=v.size()-1)
                cout<<"/";
        }
        cout<<endl;
    }

    return 0;
}