您的位置:首页 > 运维架构 > Linux

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功能(不带空格的目录名)

#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修改
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息