printf in循环中的getline行为

时间:2015-09-27 12:51:32

标签: c loops printf posix getline

为什么我需要按两次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#

1 个答案:

答案 0 :(得分:1)

您的循环执行以下逻辑:

  • 等待用户输入
  • 打印当前目录
  • 更改当前目录

因此,每次输入用户输入时,它将显示旧目录,更改目录(没有可见输出),然后等待新输入。这确实是您的示例输出显示的内容。

要获得所需的行为,请移动getcwd并向下显示chdir来电。

请注意,如果此人随后输入的字符串短于3(例如,他们再次按Enter键,我在测试时也这样做了,你也是这样做了)你继续打电话给chdir(&line[3]);,导致不良结果(可能是UB)因为这是超过字符串的结尾。在我的系统上,它重复了chdir("..")。要解决此问题,您应该检查linelen >= 3(以及它确实以cd开头),如果没有,请不要致电chdir