目錄操作
類別
字符串處理
時間限制
1S
內存限制
256Kb
問題描述
在操作系統中,文件系統一般採用層次化的組織形式,由目錄(或者文件夾)和文件構成,形成一棵樹的形狀。
有一個特殊的目錄被稱爲根目錄,是整個文件系統形成的這棵樹的根節點,在類Linux系統中用一個單獨的 “/”符號表示。
因此一個目錄的絕對路徑可以表示爲“/d2/d3”這樣的形式。
當前目錄表示用戶目前正在工作的目錄。爲了切換到文件系統中的某個目錄,可以使用“cd”命令。
假設當前目錄爲“/d2/d3”,下圖給出了cd命令的幾種形式,以及執行命令之後的當前目錄。
現在給出初始時的當前目錄和一系列目錄操作指令,請給出操作完成後的當前目錄。
輸入說明
第一行包含一個字符串,表示當前目錄。
後續若干行,每行包含一個字符串,表示需要進行的目錄切換命令。
最後一行爲pwd命令,表示輸出當前目錄
注意:
- 所有目錄的名字只包含小寫字母和數字,cd命令和pwd命令也都是小寫。最長目錄長度不超過200個字符。
- 當前目錄已經是根目錄時,cd … 和cd /不會產生任何作用
輸出說明
輸出一個字符串,表示經過一系列目錄操作後的當前目錄
輸入樣例
/d2/d3/d7
cd …
cd /
cd /d1/d6
cd d4/d5
pwd
輸出樣例
/d1/d6/d4/d5
說明和解析
這道題對於本菜雞來說,確實是“一道題寫一個下午”
主要還是邏輯上的大量bug
a數組爲目錄 b數組爲命令
1.思路:看起來比較複雜
一共是四種情形
所以一個if…else if…else if…else…
cd / 最簡單的情形,判斷第四個字符(注意下標爲3 我第一次就倒在這裏了)和第五個字符
判斷語句:if(b[3]== ‘/’&&b[4] ==’\0’) 或者 (strcmp(b,“pwd”)==0
後面以此類推
cd …
cd /d1/d2
cd d1/d2
麻煩的不在於判斷,在後面的處理
對第一種 cd/類型 方法是將a數組內容直接變爲‘/’
第二種 cd …類型 是要到上一目錄
首先看a數組是不是‘/’ 也就是根目錄,如果已經是根目錄的話那 cd …操作就無效了
如果不是根目錄那就要刪除
怎麼刪呢?
對a數組從後往前進行掃描,如果不是‘/’ 那麼就賦爲0(字符’\0’)
是‘/’的話也賦爲0,然後退出循環(break)
第三種 cd /d1/d2
將a數組全部清空! 然後把/d1/d2給a數組即可
怎麼給呢?
從第4個字符(下標爲3)往後掃,全部加入a數組!
然而我就在清空這一步卡住,本來想清空用a[i]=0,然而並不行!!!
於是用a[i]=1 先代替下,但應該不對,OJ評測過了 所以在代碼中寫上了註釋,希望dalao幫助修改,提出新方案
第四種 cd d1/d2
在a數組後面加上這一段字符串就行
如果是根目錄/ 就直接加的d1/d2
否則先加“/” 然後再把這段字符串複製過去
#include<stdio.h>
#include<string.h>
int main()
{
char a[201],b[201];
gets(a);
int i,j;
while(1)
{
gets(b);
if(strcmp(b,"pwd")==0) break;
else
{
if(strcmp(b,"cd /")==0)
{
strcpy(a,"/");
}
else if(b[4]=='.')
{
if(strcmp(a,"/")!=0)
{
for(i=strlen(a)-1;i>=0;i--)
{
if(a[i]!='/') a[i]=0;
else if(a[i]=='/'&& strlen(a)>1)
{
a[i]=0;
break;
}
}
}
}
else if(b[3]=='/'&&b[4]!=0)
{
for(i=0;i<strlen(a);i++)
a[i]=1; //這是令我百思不得其解的問題,需要dalao指正(發現想把a數組全部賦值爲0(也就是字符‘\0’)是不行的)
for(i=3;b[i]!='\0';i++)
{
a[i-3]=b[i];
}
a[i+4]=0;
}
else
{
if(strcmp(a,"/")==0)
{
j=1;
for(i=3;b[i]!='\0';i++,j++)
{
a[j]=b[i];
}
a[j]='\0';
}
else
{
i=strlen(a);
a[i]='/';
i++;
for(j=3;b[j]!='\0';i++,j++)
{
a[i]=b[j];
}
a[++i]='\0';
}
}
}
}
puts(a);
}
另外這題OJ測試點
主要卡在4上