ccf真題-201604-3-.路徑解析-題解
阿新 • • 發佈:2019-01-09
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