1. 程式人生 > >ccf真題-201604-3-.路徑解析-題解

ccf真題-201604-3-.路徑解析-題解

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