为什么我需要按两次Enter来获取当前目录?我注意到如果我在循环中更改printf语句的位置,行为会发生变化。我不明白为什么会这样。
下面的工作代码。它在Ubuntu系统上编译。它的工作量相当低。其中大部分是人工页面的用法。
#define _GNU_SOURCE // http://man7.org/linux/man-pages/man3/getline.3.html
#include <stdio.h>
#include <unistd.h> // http://man7.org/linux/man-pages/man3/getcwd.3.html
int main() {
char *line = NULL;
size_t linecap = 0;
ssize_t linelen;
while ((linelen = getline(&line, &linecap, stdin)) > 0) {
char * buf = NULL;
size_t size = 1000;
char * s = getcwd(buf, size);
printf("%s# ", s);
*(line+linelen-1) = '\0';
chdir(&line[3]);
}
return 0;
}
我没有得到程序的输出,我在下面显示(首先,我需要输入一次以获得提示 - 这没关系,并且打算用于此示例)。
/path/to/dir# cd ..
/path/to/dir#
/path/to#
答案 0 :(得分:1)
您的循环执行以下逻辑:
因此,每次输入用户输入时,它将显示旧目录,更改目录(没有可见输出),然后等待新输入。这确实是您的示例输出显示的内容。
要获得所需的行为,请移动getcwd
并向下显示chdir
来电。
请注意,如果此人随后输入的字符串短于3(例如,他们再次按Enter键,我在测试时也这样做了,你也是这样做了)你继续打电话给chdir(&line[3]);
,导致不良结果(可能是UB)因为这是超过字符串的结尾。在我的系统上,它重复了chdir("..")
。要解决此问题,您应该检查linelen >= 3
(以及它确实以cd
开头),如果没有,请不要致电chdir
。