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

6
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);
      }
  }
}

当我启动这个程序并输入“cd test”时,会出现“没有这个文件或目录”的提示。但是确实存在名为“test”的目录。
运行在Arch Linux上。

请使用以下代码检查您的 directory 字符串:printf("directory = [%s]\n", directory);,以防名称中有多余的换行符或其他不需要/不可见的字符。 - Paul R
"char change[2] = "cd"" 正在为一个大小为 2 的变量分配一个大小为 3 的数组。请改用 "char change[] = "cd""。 - William Pursell
@WilliamPursell- 实际上,他正在使用strncmp(...2),所以是合法的,尽管你的做法也很好。 - rodrigo
可能是 在 C 程序中更改 Linux Shell 中的工作目录 的重复问题。 - Jonathan Leffler
1个回答

4

man页面

fgets()函数最多从流中读取size-1个字符,并将它们存储到指向s的缓冲区中。当遇到EOF或换行符时,读取停止。如果读取到换行符,则将其存储到缓冲区中。

问题在于,你从fgets()获取的字符串末尾有一个换行符'\n',你需要将其删除:

fgets(input, 150, stdin);
input[strlen(input)-1] = '\0';

同时:
char change[2] = "cd";

那应该是change [3],它是2(代表"cd")+1(代表自动添加的NULL终止符'\0')。
然后应该能正常工作了。
编辑:
另一种替代方案是更改strtok()调用方式:
directory = strtok(NULL, " \n");

如果用户通过回车键或EOF(在Linux上为ctrl + d)字符输入字符串,则此方法将奏效... 我不确定第二种方式对于用户来说有多大可能性... 但这样做不会有坏处!


2
写成strtok(..., " \n")会不会更好一些,以防字符串以EOF或其他什么东西结尾? - rodrigo
@rodrigo - 是的,如果有EOF会更好。我想我假设用户会键入“cd <文件名> <enter键>”,而不是“cd <文件名> <ctrl + d>”...但你永远不知道!编辑答案以涵盖这一点。 - Mike
为什么只限制在“\n”而不是“\t\n\r”呢?纯属娱乐。 - rodrigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接