[英]Getline behavior with printf in loop
为什么我需要按两次 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;
}
我没有得到程序的输出,我在下面显示(首先,我需要按一次 Enter 来获得提示——这很好,适用于这个例子)。
/path/to/dir# cd ..
/path/to/dir#
/path/to#
您的循环执行以下逻辑:
因此,每次输入用户输入时,它都会显示旧目录,更改目录(没有可见输出),然后等待新输入。 这确实是您的示例输出显示的内容。
要获得所需的行为,请将getcwd
和 display 向下移动到chdir
调用下方。
请注意,如果此人随后输入了一个短于 3 的字符串(例如,他们再次按 Enter,我在测试时也是这样做的,您也是如此),您将继续调用chdir(&line[3]);
无论如何,这会导致不希望的结果(可能是 UB),因为这已经超出了字符串的末尾。 在我的系统上,它重复了chdir("..")
。 要解决这个问题,您可能应该检查linelen >= 3
(并且它确实以cd
开头),如果不是,则不要调用chdir
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.