91. 文件系统 //字符串操作

本文介绍了一种基于树形结构的文件系统管理算法,该算法能够处理文件和目录的创建、列出目录下的文件和子目录等操作。通过使用C++语言实现,文章详细解释了如何通过输入操作指令来维护和查询文件系统。

91. 文件系统

时间限制 1000 ms 内存限制 65536 KB

题目描述

现在很多操作系统的文件系统都是基于树形结构设计的。即一个目录下可以有若干个目录和文件,而每个目录和文件都可以通过一条从根目录出发的唯一路径来唯一确定。我们希望你实现对这样的一个文件系统的简单管理。
为了简化问题,我们做出如下假设:
假设文件系统初始时只有一个根目录root。
假设所有出现的文件和目录的名字都是唯一的。即,不会有两个相同名字的文件出现,不会有两个相同名字的目录出现,也不会有一个文件和一个目录名字相同。
文件名字和目录名字都是长度在1到20之间的字符串(包括1和20),且只由英文大写字母、英文小写字母、数字组成。大小写字母之间不等效。
你需要实现如下操作:
CREATEFILE FILENAME DIRNAME
这个操作的含义是:在DIRNAME的目录下创建一个名字为FILENAME的文件。我们保证当出现这个操作时,DIRNAME是一个已经存在的目录,而FILENAME这个名字是首次出现。
CREATEDIR DIRNAME1 DIRNAME2 这个操作的含义是:在DIRNAME2的目录下创建一个名字为DIRNAME1的目录。我们保证当出现这个操作时,DIRNAME2是一个已经存在的目录,而DIRNAME1这个名字是首次出现。
LISTFILE DIRNAME 这个操作的含义是:按照创建的先后顺序打印出DIRNAME目录下的所有文件名字。我们保证当出现这个操作时,DIRNAME是一个已经存在的目录.
LISTDIR DIRNAME 这个操作的含义是:按照创建的先后顺序打印出DIRNAME目录下的所有目录名字。我们保证当出现这个操作时,DIRNAME是一个已经存在的目录

输入格式

第一行有一个整数T,表示一共有T(T≤20)组数据需要你处理。请注意各组数据之间是相互独立的。每当处理新的一组数据时,你都应当假设此时只有一个名字为root的根目录存在。
对于每组数据,第一行有一个整数N(0< N≤100),表示有N个操作需要你处理,接下来的N行,每一个行描述了一个操作。

输出格式

对于每个LISTFILE操作和LISTDIR操作,如果找到了X个文件(或目录),你需要输出X行,按照创建时间从早到晚的顺序,每一行打印一个文件(或目录)的名字。如果找到了0个文件(或目录),就不要输出任何东西。请注意不要输出多余的空格和换行符。

输入样例

2
8
CREATEFILE desktop root
CREATEDIR DESKTOP root
LISTFILE root
LISTDIR DESKTOP
CREATEFILE scr20130412 DESKTOP
CREATEFILE scr20130411 DESKTOP
CREATEFILE scr20130413 DESKTOP
LISTFILE DESKTOP
5
LISTFILE root
CREATEDIR webapp root
CREATEDIR myweb webapp
CREATEDIR MyWeb webapp
LISTDIR webapp

输出样例

desktop
scr20130412
scr20130411
scr20130413
myweb
MyWeb
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n,i,j;
		scanf("%d",&n);
		char a[3][23];
		string s[103][3];
		for(i=0;i<n;++i)
		{
		  scanf("%s %s",a[0],a[1]);
		  s[i][0]=a[0];
		  s[i][1]=a[1];
		  if(s[i][0]=="CREATEFILE"||s[i][0]=="CREATEDIR")//输入格式控制,本题输入关键所在 
		  {
		    scanf("%s",a[2]);
		    s[i][2]=a[2];
	      }
	      if(s[i][0]=="LISTFILE")
	      {
	      	for(j=0;j<i;++j)
	      	{
	      		if(s[j][0]=="CREATEFILE"&&s[j][2]==s[i][1])
	      		 printf("%s\n",s[j][1].c_str());
	      	}
	      }
	      if(s[i][0]=="LISTDIR")
	      {
	      	for(j=0;j<i;++j)
	      	{
	      		if(s[j][0]=="CREATEDIR"&&s[j][2]==s[i][1])
	      		 printf("%s\n",s[j][1].c_str());
	      	}
	      }
		}
		
	}
}
<think>首先,用户提供了来自C语言编译器的错误信息。 问题在于函数调用 `cli_findNullHelpStr` 的参数类型不匹配: - 调用时传递了 `mL3CmdRootCmdNode`,它是一个 `cmdNode` 结构体(或类似的东西)。 - 但函数声明期望一个 `cmdNode *`(指向结构的指针)。 另一个错误:`cli_findNullHelpStr` 被声明但从未定义,导致链接错误。 用户没有明确问题,但基于上下文,他们可能想要修复这些错误。 所以,我应该提供解决方案。 规则: - 用中文回答。 - 在回答末尾添3-5个相关问题,以“§§相关问题§§”开头,然后列出1. 2. 3. 等。 - 相关问题必须基于用户的问题和我的回答。 - 不能换行分散;所有内容应紧凑。 首先,分析错误: 1. **类型不匹配错误**: - `status = cli_findNullHelpStr(mL3CmdRootCmdNode, 0);` - 参数应该是 `cmdNode *`,但传递了 `cmdNode`(结构体本身)。 - 解决方案:传递一个指针,可能写成 `&mL3CmdRootCmdNode`。 2. **未定义函数错误**: - `cli_findNullHelpStr` 在头文件中声明,但在源文件中没有定义。 - 解决方案:确保这个函数在某个地方有实现。用户可能需要提供定义或链接到正确的库。 在回答中: - 解释错误原因。 - 提供修复建议。 - 用中文。 然后,生成相关问题: 基于编译错误、类型系统、函数定义等。 例如: 1. 如何修复函数参数类型不匹配? 2. 为什么函数声明了但未定义会导致错误? 3. 如何避免在C语言中类似错误? 4. 在CMake构建系统中,如何处理链接错误? 5. 什么是cmdNode结构,它在哪定义? 确保3-5个问题。 结构回答: 1. 先回答问题部分。 2. 然后“§§相关问题§§” 3. 列出问题。 最终输出格式: [回答内容] §§相关问题§§ 1. [问题1] 2. [问题2] 3. [问题3] 4. [问题4] 如果需要5个。 </think> 根据提供的编译器错误信息,问题涉及两个主要错误:**函数参数类型不匹配**和**函数未定义**。以下是详细分析和修复建议: 1. **参数类型不匹配错误**: - 错误信息:`error: incompatible type for argument 1 of ‘cli_findNullHelpStr’` 指出 `cli_findNullHelpStr` 函数的第一个参数预期是 `cmdNode *`(指向 `cmdNode` 结构体的指针),但实际传递的是 `mL3CmdRootCmdNode`(即 `cmdNode` 结构体本身)。 - **修复方法**:在调用函数时,使用取地址操作符 `&` 获取结构体的指针。将代码修改为: ```c status = cli_findNullHelpStr(&mL3CmdRootCmdNode, 0); // & 获取指针 ``` 2. **函数未定义错误**: - 错误信息:`error: ‘cli_findNullHelpStr’ used but never defined` 表示函数在头文件 `cli_common.h` 中声明了,但在链接时找不到实现(定义)。 - **修复方法**: - 确保函数 `cli_findNullHelpStr` 在某个源文件(如 `.c` 文件)中有具体实现。例如,添定义: ```c cmdNode * cli_findNullHelpStr(cmdNode *node, int flag) { // 实现逻辑,例如遍历节点查找帮助字符串 return node; // 示例返回 } ``` - 检查构建系统(CMake):确认相关源文件已添到 `CMakeLists.txt` 的编译目标中,并正确链接库。例如: ```cmake add_library(fepL3Cmd_cli wmc_l3.c other_source.c) # 确保包含定义该函数的文件 ``` - 如果函数在外部库中,添链接依赖:`target_link_libraries(fepL3Cmd_cli your_library_name)`。 3. **其他注意事项**: - 编译器选项 `-Werror` 将所有警告视为错误,因此需确保代码无警告。 - 验证 `cmdNode` 结构体的定义是否在 `cli_common.h` 或其他头文件中完整(例如,通过 `#include` 确保类型一致)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值