繁体   English   中英

在循环中使用 printf 的 Getline 行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM