chdir()-没有这样的文件或目录

chdir()-没有这样的文件或目录,c,chdir,C,Chdir,当我启动这个并输入“cd测试”时,我得到“没有这样的文件或目录”。但是有一个目录“test” 在Arch Linux上运行。来自: fgets()从流中最多读取一个小于大小的字符,并且 将它们存储到s指向的缓冲区中。阅读结束后停止 EOF或换行符。如果新行被读取,它将被存储到缓冲区中 问题是从fgets()中获得的字符串末尾有一个换行符'\n',您需要删除它: int main(int argc, char **argv) { char input[150]; char change[2

当我启动这个并输入“cd测试”时,我得到“没有这样的文件或目录”。但是有一个目录“test”

在Arch Linux上运行。

来自:

fgets()从流中最多读取一个小于大小的字符,并且 将它们存储到s指向的缓冲区中。阅读结束后停止 EOF或换行符。如果新行被读取,它将被存储到缓冲区中

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

int main(int argc, char **argv)
{
  char input[150];
  char change[2] = "cd";
  char *directory;

  while(1) {
      prompt();
      fgets(input, 150, stdin);

      if(strncmp(change, input, 2) == 0) {
          directory = strtok(input, " ");
          directory = strtok(NULL, " ");

          printf(directory);
          chdir(directory);
          perror(directory);

      }

      if(feof(stdin) != 0 || input == NULL) {
          printf("Auf Bald!\n");
          exit(3);
      }
  }
}
此外:

这应该是
change[3]
,自动为您放置的空终止符
'\0'
为2(表示“cd”)+1

那么它应该会起作用

编辑

另一种方法是更改
strtok()
调用,以便:

char change[2] = "cd";

如果用户通过enter键或EOF(Linux上的ctrl+d)字符输入字符串,这将起作用。。。我不确定第二种情况对用户来说有多大可能。。。但它不会痛

检查您的
目录
字符串,如下所示:
printf(“目录=[%s]\n”,目录)
以防名称中有误用的换行符或其他不需要的/不可见的字符。
char change[2]=“cd”
将大小为3的数组分配给大小为2的变量。使用
char change[]=“cd”
。@williampersell-事实上,他使用的是
strncmp(…2)
,所以这是合法的,尽管你的做法很好。可能的重复应该最好还是写
strtok(…,“\n”)
,以防字符串以EOF结尾,或者什么?@rodrigo-是的,如果有EOF那就更好了。我想我假设用户会键入“cd”而不是“cd”。。。但你永远不知道!编辑答案以涵盖这一点。为什么只限于
“\n”
,而不是
“\t\n\r”
,只是为了好玩?
char change[2] = "cd";
directory = strtok(NULL, " \n");