2012-11-27 36 views
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”我得到“没有这样的文件或目录”。但是有目录“测试”。chdir() - 没有这样的文件或目录

在Arch Linux上运行。

+0

检查你的''目录'字符串是这样的:'printf(“directory = [%s] \ n”,directory);'如果你的名字中有一个杂散的换行符或其他不想要/不可见的字符。 –

+0

'char change [2] =“cd”'将大小为3的数组赋值给大小为2的变量。请改用char change [] =“cd”'。 –

+0

@ WilliamPursell-实际上,他正在使用'strncmp(... 2)',所以它是合法的,尽管无论如何你都是一个好习惯。 – rodrigo

回答

4

man page

与fgets()中至多一个小于从流大小的字符和 存储读取它们到缓冲器由s指向。读取在 EOF或换行符后停止。 如果读取换行符,它将被存储到缓冲区中。

的问题是在你的字符串,你从fgets()了年底有一个换行符'\n',您需要将其删除:

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

另外:

char change[2] = "cd"; 

那应该是change[3],对于自动为您设置的NULL终结符'\0',它是2(对于“cd”)+ 1。

然后它应该工作。

EDIT

不同的另一种方法是改变strtok()呼叫,使得:

directory = strtok(NULL, " \n"); 

如果用户输入经由所述输入键或经由EOF(CTRL字符串这将工作+ d在Linux上)角色......我不确定第二个对用户来说有多可能...但它不会伤害!

+2

Shouldn'写'strtok(...,“\ n”)'是最好的,以防万一字符串以EOF结尾,或者什么? – rodrigo

+0

@rodrigo - 是的,如果有EOF,情况会更好。我想我假设用户会输入“cd ”而不是“cd ”......但你永远不知道!编辑答案来说明这一点。 – Mike

+0

非常感谢。它现在的作品:) – csczigiol

相关问题