linux c编程实现cd目录切换功能(带空格的目录名问题)
2015-05-30 19:04
489 查看
最近学习linux编程,其中学到shell编程是要求自己写个MyShell
在实现最基本的cd命令时就碰到了麻烦:chdir无法进出带空格的目录名
百度了一些都说chdir()不可进出,但实际上chdir()是可以的,需要把' '换为'\ '
以此为契机,把我今晚的工作:cd命令的实现介绍一遍
现有如下目录结构: /home/yong/Desktop/ /e e /e e e/
bash中要从/home/yong/Desktop切换到/home/yong/Desktop/ /e e /e e e/的一些办法:
cd ./Desktop/' '/'e e '/'e e e'
cd ./Desktop/" "/"e e "/"e e e"
cd ./Desktop/\ /e\ e\ /e\ e\ e/
没错,下面的工作从仿造开始
环境:
ubuntu 12.04 LTS
gcc-ver: i686-linux-gnu 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
要实现的功能:
输入:带空格的路径名
内部处理:利用chdir()函数cd到输入的路径
输出:切换路径后的新路径
测试样例1:
输入:
/home/yong/Desktop/' '/"e e "/e\ e\ e
输出:
/home/yong/Desktop/' '/"e e "/e\ e\ e
/home/yong/Desktop/ /e e /e e e
/home/yong/Desktop/ /e e /e e e
测试样例2:(当前目录为/home/yong/Desktop)
输入:
./' '/"e e "/e\ e\ e
输出:
./' '/"e e "/e\ e\ e
./ /e e /e e e
/home/yong/Desktop/ /e e /e e e
而我现在要通过c编程先实现cd功能(不带空格的目录名)
(以下代码均产生\040 warning,属正常情况,不必理会)
干货继续上,实现从/home/yong/Desktop/到/home/yong/Desktop/ /e e /e e e/的静态cd
接下来实现从/home/yong/Desktop/到/home/yong/Desktop/ /e e /e e e/的动态cd,先是单引号'方法作尝试
ok,来到这里就差不多了,最后是实现文章开头提及的3种办法
实验至此完满结束
/*******************************************************
*最近发现了篇文章,同样是实现shell的,完整版的哦,值得参考
地址:点击打开链接
2015.06.01修改
在实现最基本的cd命令时就碰到了麻烦:chdir无法进出带空格的目录名
百度了一些都说chdir()不可进出,但实际上chdir()是可以的,需要把' '换为'\ '
以此为契机,把我今晚的工作:cd命令的实现介绍一遍
现有如下目录结构: /home/yong/Desktop/ /e e /e e e/
bash中要从/home/yong/Desktop切换到/home/yong/Desktop/ /e e /e e e/的一些办法:
cd ./Desktop/' '/'e e '/'e e e'
cd ./Desktop/" "/"e e "/"e e e"
cd ./Desktop/\ /e\ e\ /e\ e\ e/
没错,下面的工作从仿造开始
环境:
ubuntu 12.04 LTS
gcc-ver: i686-linux-gnu 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
要实现的功能:
输入:带空格的路径名
内部处理:利用chdir()函数cd到输入的路径
输出:切换路径后的新路径
测试样例1:
输入:
/home/yong/Desktop/' '/"e e "/e\ e\ e
输出:
/home/yong/Desktop/' '/"e e "/e\ e\ e
/home/yong/Desktop/ /e e /e e e
/home/yong/Desktop/ /e e /e e e
测试样例2:(当前目录为/home/yong/Desktop)
输入:
./' '/"e e "/e\ e\ e
输出:
./' '/"e e "/e\ e\ e
./ /e e /e e e
/home/yong/Desktop/ /e e /e e e
而我现在要通过c编程先实现cd功能(不带空格的目录名)
#include #include #include int main(){ char pwd[1000]; gets(pwd); printf("%s\n",pwd); if(chdir(pwd)==-1){perror("chdir");exit(1);} getcwd(pwd,1000); printf("%s\n",pwd); return 1; }
(以下代码均产生\040 warning,属正常情况,不必理会)
干货继续上,实现从/home/yong/Desktop/到/home/yong/Desktop/ /e e /e e e/的静态cd
#include #include #include #include int main(){ char pwd[1000]; /*int i=0,j=0; gets(pwd); while(pwd[i]!=0){ if( }*/ strcpy(pwd,"./e\ e\ e"); printf("%s\n",pwd); if(chdir(pwd)==-1){perror("chdir");exit(1);} getcwd(pwd,1000); printf("%s\n",pwd); return 1; }
接下来实现从/home/yong/Desktop/到/home/yong/Desktop/ /e e /e e e/的动态cd,先是单引号'方法作尝试
#include #include #include #include char* stdPath(char* path){ int i=0,j=0,conFlag=0; while(path[i]!=0){ if(conFlag==1){ if(path[i]==' '){ path[i]='\ '; } else if(path[i]=='\''){ conFlag=0; i++; continue; } }else if(path[i]=='\''&&conFlag==0){ conFlag=1; i++; continue; } path[j]=path[i]; i++;j++; } path[j]=0; } int main(){ char pwd[1000]; gets(pwd); printf("%s\n",pwd); stdPath(pwd); printf("%s\n",pwd); if(chdir(pwd)==-1){perror("chdir");exit(1);} getcwd(pwd,1000); printf("%s\n",pwd); return 1; }
ok,来到这里就差不多了,最后是实现文章开头提及的3种办法
#include #include #include #include char* stdPath(char* path){ int i=0,j=0,conFlag=0; /* conFlag info * 0 not in process moment * 1 in single quote moment * 2 in double quote moment */ while(path[i]!=0){ if(conFlag&3){ if(path[i]==' '){ path[i]='\ '; } else if(path[i]=='\''&&conFlag==1){ conFlag=0; i++; continue; } else if(path[i]=='\"'&&conFlag==2){ conFlag=0; i++; continue; } }else if(path[i]=='\''&&conFlag==0){ conFlag=1; i++; continue; }else if(path[i]=='\"'&&conFlag==0){ conFlag=2; i++; continue; }else if(path[i]=='\\'&&conFlag==0){ if(path[i+1]==' ') path[++i]='\ '; } path[j]=path[i]; i++;j++; } path[j]=0; } int main(){ char pwd[1000]; while(1){ gets(pwd); printf("%s\n",pwd); stdPath(pwd); printf("%s\n",pwd); if(chdir(pwd)==-1){perror("chdir");} getcwd(pwd,1000); printf("%s\n\n\n",pwd); } return 1; }
实验至此完满结束
/*******************************************************
*最近发现了篇文章,同样是实现shell的,完整版的哦,值得参考
地址:点击打开链接
2015.06.01修改
相关文章推荐
- Linux下GPIO驱动详解文章
- Linux下编译fortran程序_基本菜鸟版
- uboot环境变量与内核MTD分区关系
- Linux C函数参考手册(PDF版)
- Lua教程(十七):C API简介
- C#实现打造气泡屏幕保护效果
- C/C++数据对齐详细解析
- C 语言基础教程(我的C之旅开始了)[三]
- C++中的extern “C”用法详解
- C 语言基础教程(我的C之旅开始了)[七]
- C字符串操作函数实现方法小结
- C/C++ 宏详细解析
- C/C++实现对STORM运行信息查看及控制的方法
- 用C#生成不重复的随机数的代码
- 在c和c++中实现函数回调
- 浅析C/C++中被人误解的SIZEOF
- C 语言基础教程(我的C之旅开始了)[六]
- C/C++实现的游戏角色名称名字随机生成代码
- C/C++函数调用的几种方式总结