【问题标题】:Getline behavior with printf in loop循环中使用 printf 的 Getline 行为
【发布时间】:2015-12-24 19:34:47
【问题描述】:

为什么我需要按两次回车才能更改当前目录?我注意到,如果我在循环中更改 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#

【问题讨论】:

  • 什么是“东西”?变量s 从未使用过?
  • 什么是getline?这是非标准的
  • 我编辑了错字。例如,可能是对 chdir(2) 的系统调用。
  • 代码没有意义,请附上somethingminimal reproducible example是什么
  • 我在代码中添加了一条注释来说明 getline(3) 是什么。我将很快更改代码以使用 chdir(2) 而不是“某事”...

标签: c loops printf posix getline


【解决方案1】:

您的循环执行以下逻辑:

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

所以每次你输入用户输入时,它都会显示旧目录,改变目录(没有可见的输出)然后等待新的输入。这确实是您的示例输出所显示的内容。

要获得您想要的行为,请将getcwd 移动并向下显示到chdir 调用下方。

请注意,如果该人随后输入了一个小于 3 的字符串(例如,他们再次按 Enter,我在测试时也这样做了,你也这样做了)你继续调用 chdir(&amp;line[3]);,这会导致不希望的结果(可能是 UB),因为这超过了字符串的结尾。在我的系统上,它重复了chdir("..")。要解决此问题,您可能应该检查linelen &gt;= 3(并且它实际上确实以cd 开头),如果不是,则不要调用chdir

【讨论】:

  • 感谢您的回复。是的,我故意把它做得很小,但我想我的输出是幸运的,基于我的环境。我知道了。当然,它只是通过循环的一次迭代而关闭。这是一个简单的循环问题......我想我可以让我的代码更简约哈哈。
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 2013-01-21
  • 2019-07-27
  • 2014-12-11
  • 2018-06-30
  • 2022-01-25
  • 2021-10-31
  • 1970-01-01
相关资源
最近更新 更多