使用execvp()时出现问题 注:以上内容为目录一级以上!

使用execvp()时出现问题 注:以上内容为目录一级以上!,c,parsing,arguments,execvp,C,Parsing,Arguments,Execvp,此外,我怀疑这些问题是有联系的,我不能cd进入目录,但是我不能100%确定这一点,因为它不会抛出任何类似目录不存在的东西;我只得到一个空白(但我的cwd没有更新) 任何帮助都将不胜感激 一些测试输入仅供参考 ls: cannot access : No such file or directory ..: cat cat.c cat.c~ m4 确认目录“测试”确实存在: [thanasi@localhost m4]$ ./cli [root@localhost /home/thanas

此外,我怀疑这些问题是有联系的,我不能
cd
进入目录,但是我不能100%确定这一点,因为它不会抛出任何类似目录不存在的东西;我只得到一个空白(但我的cwd没有更新)

任何帮助都将不胜感激

一些测试输入仅供参考

ls: cannot access : No such file or directory
..:
cat  cat.c  cat.c~  m4
确认目录“测试”确实存在:

[thanasi@localhost m4]$ ./cli
[root@localhost /home/thanasi/Systems Programming/m4]$ ls

ls: cannot access : No such file or directory
[root@localhost /home/thanasi/Systems Programming/m4]$ ls ..

ls: cannot access : No such file or directory
..:
cat  cat.c  cat.c~  m4
[root@localhost /home/thanasi/Systems Programming/m4]$ cd test

[root@localhost /home/thanasi/Systems Programming/m4]$ cd /test           

/usr/bin/cd: line 2: cd: /test: No such file or directory
[root@localhost /home/thanasi/Systems Programming/m4]$ ^C

通常,从
fgets
获得的输入以换行符结束。假设您将
{l',s','\n','\0'}
作为
路径中的前四个字节。然后,当
parseArgs
argv[0]
设置为指向
path
中的第一个字符时,下一次迭代将使用
'\0'
覆盖换行符,并将
argv[1]=&path[2]

[thanasi@localhost m4]$ ls -al
total 36
drwxrwxr-x. 3 thanasi thanasi  4096 Mar 17 22:00 .
drwxrwxr-x. 3 thanasi thanasi  4096 Mar 17 20:36 ..
-rwxrwxr-x. 1 thanasi thanasi 13175 Mar 17 22:00 cli
-rw-rw-r--. 1 thanasi thanasi  1222 Mar 17 22:00 cli.c
-rw-rw-r--. 1 thanasi thanasi  1221 Mar 17 22:00 cli.c~
drwxr-xr-x. 2 root    root     4096 Mar 17 21:32 test
因此,
argv
数组包含指向最后一个实数参数和终止数组的
NULL
之间的空字符串的指针。因此,
ls
尝试列出不存在的
”的内容

由于您无法确定从
fgets
获得的输入是否以换行符结尾,因此请保护分配

void parseArgs(char *path, char *argv[]) {
    while (*path != '\0') {
        while (*path == ' ' || *path == '\t' || *path == '\n') {
            *path++ = '\0';
        }
        *argv++ = path;
        while (*path != '\0' && *path != ' ' && *path != '\t' && *path != '\n') {
            path++;
        }
    }
    *argv = '\0';
}

为了避免这种情况

@JoachimPileborg,我不太清楚这个问题发生在哪里;我可以用parseArgs中的*argv='\0'来实现这一点。@capncoolio
*argv='\0'
容易混淆,请将其设置为
*argv=NULL必须清晰易懂。我建议您使用调试器并逐步完成解析函数,以确保它正确设置参数数组。我会看看我能想出什么。谢谢!这个网站的优秀贡献者教给我的编程知识比任何讲师都多。希望有一天我能成为一个有价值的贡献者。你的建议完美无瑕。我正在想办法使用cd;显然,使用execvp()(本地CWD等)这样做有些困难
void parseArgs(char *path, char *argv[]) {
    while (*path != '\0') {
        while (*path == ' ' || *path == '\t' || *path == '\n') {
            *path++ = '\0';
        }
        *argv++ = path;
        while (*path != '\0' && *path != ' ' && *path != '\t' && *path != '\n') {
            path++;
        }
    }
    *argv = '\0';
}
if (*path) *argv++ = path;