XDOJ目錄操作

目錄操作

類別
字符串處理

時間限制
1S

內存限制
256Kb

問題描述
在操作系統中,文件系統一般採用層次化的組織形式,由目錄(或者文件夾)和文件構成,形成一棵樹的形狀。
有一個特殊的目錄被稱爲根目錄,是整個文件系統形成的這棵樹的根節點,在類Linux系統中用一個單獨的 “/”符號表示。
因此一個目錄的絕對路徑可以表示爲“/d2/d3”這樣的形式。
當前目錄表示用戶目前正在工作的目錄。爲了切換到文件系統中的某個目錄,可以使用“cd”命令。
假設當前目錄爲“/d2/d3”,下圖給出了cd命令的幾種形式,以及執行命令之後的當前目錄。
在這裏插入圖片描述
現在給出初始時的當前目錄和一系列目錄操作指令,請給出操作完成後的當前目錄。

輸入說明
第一行包含一個字符串,表示當前目錄。
後續若干行,每行包含一個字符串,表示需要進行的目錄切換命令。
最後一行爲pwd命令,表示輸出當前目錄
注意:

  1. 所有目錄的名字只包含小寫字母和數字,cd命令和pwd命令也都是小寫。最長目錄長度不超過200個字符。
  2. 當前目錄已經是根目錄時,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上
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章