你想在這裏什麼是「replaceDots」功能。
它通過記住最後一次的有效項目的位置,然後如果你點然後移除該項目。完整的描述在這裏「刪除點段」http://tools.ietf.org/html/rfc3986。在RFC頁面搜索刪除點段。
你需要不止一個循環。內部循環提前掃描並查看下一部分,然後如果它是點,則當前部分被跳過等,但可能比這更棘手。或者考慮將其分解成多個部分,然後遵循該算法。
當輸入緩衝器不爲空,循環如下:
A.如果輸入緩衝器與「../」或「./」前綴開始, 然後刪除該前綴來自輸入緩衝區;否則,
B.如果輸入緩衝區以「/./」或「/。」的前綴開頭,則其中「。」爲 。是一個完整的路徑段,然後用輸入緩衝區中的「/」替換前綴 ;否則,
C.如果輸入緩衝器開始於「/../」或「/ ..」, 的前綴,其中「..」是一個完整的路徑段,然後替換 前綴「/從輸出緩衝器 「在輸入緩衝器和刪除最後 段及其前面的‘/’(如果有的話);否則,
D.如果輸入緩衝器僅由「」或「..」,然後從輸入緩衝區中刪除 ;否則,
E.移動在輸入緩衝器中的第一個路徑段的 端部的輸出緩衝器,包括最初的「/」字符(如果 有的話)和任何後續字符爲止,但不包括 下一個「/」字符或輸入緩衝區的結尾。
- 最後,輸出緩衝區由於 remove_dot_segments而返回。功能。
它通過記住最後一次的有效項目的位置,然後如果你點然後移除該項目。完整的描述在這裏
這裏是我的IN C版本的IT ++ ...
ortl_funcimp(len_t) _str_remove_dots(char_t* s, len_t len) {
len_t x,yy;
/*
Modifies the string in place by copying parts back. Not
sure if this is the best way to do it since it involves
many copies for deep relatives like ../../../../../myFile.cpp
For each ../ it does one copy back. If the loop was implemented
using writing into a buffer, you would have to do both, so this
seems to be the best technique.
*/
__checklenx(s,len);
x = 0;
while (x < len) {
if (s[x] == _c('.')) {
x++;
if (x < len) {
if (s[x] == _c('.')) {
x++;
if (x < len) {
if (s[x] == _c('/')) { // ../
mem_move(&s[x],&s[x-2],(len-x)*sizeof(char_t));
len -= 2;
x -= 2;
}
else x++;
}
else len -= 2;// .. only
}
else if (s[x] == _c('/')){ // ./
mem_move(&s[x],&s[x-1],(len-x)*sizeof(char_t));
len--;
x--;
}
}
else --len;// terminating '.', remove
}
else if (s[x] == _c('/')) {
x++;
if (x < len) {
if (s[x] == _c('.')) {
x++;
if (x < len) {
if (s[x] == _c('/')) { // /./
mem_move(&s[x],&s[x-2],(len-x)*sizeof(char_t));
len -= 2;
x -= 2;
}
else if (s[x] == _c('.')) { // /..
x++;
if (x < len) { //
if (s[x] == _c('/')) {// /../
yy = x;
x -= 3;
if (x > 0) x--;
while ((x > 0) && (s[x] != _c('/'))) x--;
mem_move(&s[yy],&s[x],(len-yy) * sizeof(char_t));
len -= (yy - x);
}
else {
x++;
}
}
else {// ends with /..
x -= 3;
if (x > 0) x--;
while (x > 0 && s[x] != _c('/')) x--;
s[x] = _c('/');
x++;
len = x;
}
}
else x++;
}
else len--;// ends with /.
}
else x++;
}
}
else x++;
}
return len;
}
你能詳細說明你的具體情況是什麼嗎?也許有一種更簡單的方法可以做任何你想做的事情。 – 2013-02-14 20:34:07
你沒有嘗試過3種來自pguardiario的帖子的工具,在他的評論中鏈接到你鏈接的第二個問題上? – qdinar 2016-01-03 16:13:22