题目:路径解析题目
1.
需要规范化的情况 | 解决 |
---|---|
输入为空 | 输出当前位置 |
输入为相对路径 | 修改为绝对路径 |
遇到 /../ | 若前面没有了,说明是根目录,没有上一层直接删去; 若前面还有,则需要把前面一个目录或文件名也删去 |
遇到 /./ | 表示当前位置,可直接删去 |
遇到多个/ | 只保留一个 |
2.根据题目指示的输入输出:
输入格式:第一行包含一个整数 P,表示需要进行正规化操作的路径个数。
第二行包含一个字符串,表示当前目录。
以下 P 行,每行包含一个字符串,表示需要进行正规化操作的路径。
输出格式:共 P 行,每行一个字符串,表示经过正规化操作后的路径,顺序与输入对应。
3.AC代码:
// ===============================================================================
// File Name : ccf真题-201604-3-.路径解析AC代码.cpp
// Author : Sneexy
// Create Time : 2017/03/10 19:40:49
// Update Time : 2017/03/10 19:40:49
// CSDN blog address : http://blog.csdn.net/qq_33810513
// refer to : http://blog.csdn.net/zhembrace/article/details/52355553
// ===============================================================================
#include
#include
using namespace std;
int main()
{
int num,pos,pos1;
string curPos,line;
cin >> num >> curPos;
getchar();
while (num--)
{
getline(cin, line);
// 1.首位不为'/'的情况
if (line.empty())line = curPos;
else if (line[0] != '/')line = curPos + "/" + line;
// 2.出现/../
while ((pos = line.find("/../")) != -1)
{
if (!pos)line.erase(0, 3);
else{
pos1 = line.rfind("/", pos - 1);
line.erase(pos1, pos - pos1 + 3);
}
}
while ((pos = line.find("/./")) != -1)line.erase(pos, 2);// 3.出现/./
while ((pos = line.find("//")) != -1) line.erase(pos, 1);// 4.出现///
if (line.size()>1 && line[line.size() - 1] == '/')line.erase(line.size() - 1, 1);// 5.末尾有/
cout << line << endl;// 6.最后输出
}
return 0;
}
4.需要注意的地方:
——如果用cin>>line的方式输入string类型的line,会导致不能判断为空的输入,所以采用getline。而且在while循环之前还需要添加getchar(),吸收换行。否则90分;
——c++中单双引号的区别:
""是字符串,C风格字符串后面有一个'\0';''是一个字符,一共就一字节。
单引号表示是字符变量值,字母的本质也是数字。双引号表示字符串变量值,给字符串赋值时系统会自动给字符串变量后面加上一个\0来表示字符串结尾。
——string rfind用法:
找到字符串中最后一个和搜索字串一致的位置,而不是查找和搜索字串反过来以后匹配的位置
5.参考:
http://blog.csdn.net/zhembrace/article/details/52355553 题解
http://blog.csdn.net/youxin2012/article/details/9162415 find()和rfind()用法
Written by Sneexy