问题描述:
/a/b/../../c简化后为/c
/a//b././简化后为/c
问题解析:将字符串转换为istringstream流,进行字符串分割,是"..”并且进入一层目录,则进行回退(pop_back),如果是目录,则保存目录;如果是“..”并且没有目录级可回退,则在根目录下;若为“.”或者为空(两个//)则跳过
使用getline对字符串进行分割,函数原型为:
istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );
作用:作用是从istream中读取至多n个字符保存在s对应的数组中。即使还没读够n个字符,如果遇到换行符'\n'(第一种形式)或delim(第二种形式),则读取终止,'\n'或delim都不会被保存进s对应的数组中。
getline(cin,str);从输入流中读取一行,并保存读取内容到str中,不包括换行符。
#include<string>
#include<vector>
#include<sstream>
#include<iostream>
using namespace std;
string simplifyPath(string path) {
istringstream ss(path);
string s;
vector<string>res;
while (getline(ss, s, '/')){
if (s==""||s=="."){
continue;
}
else if (s == ".." && !res.empty()){
res.pop_back();
}
else if(s!=".."){
res.push_back(s);
}
}
string way;
for (int i = 0; i < res.size(); i++){
way += "/" + res[i];
}
return res.empty()?"/":way;
}
int main()
{
string s = "/a/b/c../..///d./d/s";
string res = simplifyPath(s);
cout << res << endl;
system("pause");
}
参考:https://www.nowcoder.com/questionTerminal/393e5a246a7546d1b2e4d7719647b7d9