使用了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;
}