一直打不起精神,直到前几个月开始时间emacs 和 vim,两款在神左右相伴的编辑器,很强大,很舒服,相见恨晚。
程序是小程序,是《Understanding Unix/Linux Programming - A Guide to Theory and Practice》这本书中4.15的习题。题目是这样的:
Unix 命令 mkdir 接受选项 -p。编写一种支持这个选项的 mkdir 命令版本
题目不是很难,查看 man mkdir 可知如下:
-p, --parents
no error if existing, make parent directories as needed
好,根据功能描述开始实现吧~代码如下:
/*
* =====================================================================================
*
* Filename: mkdir.c
*
* Description: mkdir
*
* Version: 1.0
* Created: 2012年09月02日 16时11分17秒
* Revision: none
* Compiler: gcc
*
* Author: Guotf(), tfguo369@gmail.com
* Organization:
*
* =====================================================================================
*/
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include "debug.h"
#include "error.h"
#define DIR_MODE 0777
#define ARRAY_LENGTH 1000
int checkPath(char *, char *);
int is_dir_exist(char *);
void deal_dir(char *);
/*
checkPath 这个函数写的不好,循坏的控制很差,希望大牛指正批评。
*/
int checkPath(char *path, char *spath){
memset(path, 0, ARRAY_LENGTH);
int i = 0;
char c;
char *originp = spath;
#ifdef DEBUG
printf("av[1] is %s\n", spath);
#endif
while(c)
{
#ifdef DEBUG
printf("c is %c , ", c);
printf("i is %d\n", i);
#endif
#ifdef DEBUG
printf("*spath is %c.(out)\n", *spath);
#endif
while((c = *spath++) != '/' && c != '\0'){
i++;
}
if(i == 0){
if(!is_dir_exist("/")){
deal_dir("/");
}
}
else{
memcpy(path, originp, i);
#ifdef DEBUG
printf("debug %s\n", path);
#endif
deal_dir(path);
}
i++;
}
}
int is_dir_exist(char *name){
DIR *d = opendir(name);
return d == NULL ? 0 : 1;
}
void deal_dir(char *name){
#ifdef DEBUG
printf("debug %s\n", name);
#endif
if(!is_dir_exist(name)){
if(mkdir(name, DIR_MODE) == -1){
perror("Error");
exit(1);
}
}
}
int main(int ac, char *av[]){
char path[ARRAY_LENGTH];
if(ac != 2){
error(stderr, "dir is invalid.");
}
else{
checkPath(path, av[1]);
}
}
目前测试没有bug,但以我的性格,虽然经过测试,但此程序难免会漏洞百出滴!
好了,给自己打打气,明天继续埋头~
分享到:
相关推荐
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习...mkdir -p build make ./main make clean ```
基于Qt的演示项目,以演示如何使用和实现基本的3D图形功能。 没有优化。 仅用于教育目的。 目的 学生提交是此存储库的主要目标。 不要在生产中使用此代码!!! 要求 git ; 与C ++ 17兼容的编译器; CMake 3.10+ ;...
控制台组件预览安装用法构建目标动机贡献预览安装:创建项目:用法:安装最简单的安装方法是使用vscode扩展名:Marketplace存储库另外,也可以通过一些手动步骤来实现:首先,让我们下载CPM脚本mkdir -p cmake && ...
码头工人基地 Docker映像的基本构建脚本 此存储库包含具有用于docker构建自动化的全部功能的脚本,以及用于自定义部署步骤的示例实现... mkdir -p docker-myproject/src git clone https://github.com/anchor/docker-ba
1.关机时执行某个脚本的具体思路 (1)在文件夹/etc/init.d/下创建关机时需要执行的脚本file_name; (2)分别在文件夹/etc/rc0.d/和/etc/rc6.d/下创建该该脚本文件的链接文件K07file_name: ...sudo mkdir -p /var/lo
【资源说明】 基于NMPC的无人艇定点控制与轨迹跟踪控制仿真C++源码+...3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
虚拟控制台的切换可以通过按下Alt键和一个功能键来实现,通常使用F1-F6 。 例如,用户登录后,按一下“Alt+ F2”键,用户就可以看到上面出现的“login:”提示符,说明用户看到了第二个虚拟控制台。然后只需按“Alt+...
1.功能:创建新的子目录 2.类型:内部命令 3.格式:MD[盘符:][路径名]〈子目录名〉 4.使用说明: (1)“盘符”:指定要建立子目录的磁盘驱动器字母,若省略,则为当前驱动器; (2)“路径名”:要...
要的是,Linux 上有公认的 C 语言世界最好的编译器 gcc,如果你想得到一个效率更高的开 发环境(并不一定是最友好的,但一定是最强大的),我建议你一定要好好的熟悉一下 Linux。 三.如何得到Linux? 据我所知...
logo 设计不会,就这样先凑合了写道 Fuseblog预备开发带在线SHOP功能的个人博客系统.仿照Appfuse 提供一个完全自动化的ant构建脚本.在线SHOP的数据库建模图例已经 在博客中贴出.感兴趣的和我一起搭建,嘻嘻 文档博客...
一、 功能所需工具 下载工具 OpenOffice http://zh.openoffice.org/new/zh_cn/downloads.html JodConverter http://dldx.csdn.net/fd.php?i=992314146801277&s=08dbee95a6e2dda1a95aa8cbf4df197b Swftools(pdf2swf) ...