chdir: No such file or directory (chdir()函数、strtok()函数)

最近在做 “类ftp文件传输云盘” 的一个文件管理系统时,在实现 “cd”  命令功能时调用chdir函数跳转目录,但是一直出现   “chdir: No such file or directory”  此错误。再三检查发现问题出现在换行符 "\n"。

补充(了解跳过):

chdir()  函数的使用

头文件:#include <unistd.h> 

定义函数:int chdir(const char * path); 

参数:指向目标目录的指针

函数说明:chdir()用户将当前的工作目录改变成以参数路径所指的目录。 

返回值执行成功则返回0,失败返回-1,errno为错误代码。 

为什么不直接调用 system 函数来跳转目录呢?

因为调用 system 函数相当于 fork 出一个子进程来处理跳转目录,子进程执行了 cd 命令后改变了自己的 pwd, 但是子进程执行完后会消亡,而父进程的路径没有改变,所以不能使用 system 函数来跳转目录。

部分代码:

//字符串分割,获取路径
char *stringStrtok(char *buf)
{
        char *p = NULL;
        p = strtok(buf," ");
        p = strtok(NULL," ");
        return p;
}


ret = stringStrtok(msg.cmd);  //获取路径
printf("current folder:%s\n",ret);  //打印获取到的路径
int are = chdir(ret);  //跳转到路径目录
if(are == -1){
    perror("chdir");  //打印错误信息
}
else{
    strcpy(msg.data,"chair success!\n");  //字符串拷贝
    write(c_fd,&msg,sizeof(msg));  //将字符串写入结构体
}
break;

补充:strtok()函数

  • char *strtok(char *str, const char *delim);

  • 参数1:欲分割的字符串

  • 参数2:分隔字符串

当strtok()在参数s的字符串中发现到参数delim的分割字符时则会将该字符改为\0字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回下一个分割后的字符串指针。
返回值:返回下一个分割后的字符串指针,如果已无从分割则返回NULL。

出现此错误的原因在于   如果用户通过回车键或通过EOF (Linux上的ctrl + d)字符输入字符串,这将会运行。

例如  fgets()函数

fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer.

fgets()从流中最多读入一个小于size的字符,并将它们存储到s所指向的缓冲区中。读取在EOF或换行符后停止。如果读取了换行符,则将其存储到缓冲区中。

问题是有一个换行符'\n'在你从fgets()得到的字符串的末尾,你需要删除它:

所以在调用strtok()函数时,应该写strtok(....," \n"),以防字符串以EOF或其它形式结束。

修改之后的运行效果:

总结:

1、在涉及到获取用户输入时要注意换行符的处理,"\n"也输入一个字符,应该考虑到。

2、在涉及到数组的处理时要注意结束符  "\0",它是自动补充的,会起到作用,特别是涉及到数组的空间开辟以及访问时应该被注意。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

◣星河◢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值