如何在C语言中读取管道内容?

15 浏览
0 Comments

如何在C语言中读取管道内容?

我想要实现以下功能:\n

$ echo "hello world" | ./my-c-program
piped input: >>hello world<<

\n我知道应该使用isatty来判断stdin是否为tty。如果不是tty,我想要读取管道内容——在上面的例子中,就是字符串hello world。\n在C语言中,有什么推荐的方法吗?\n这是我目前的代码:\n

#include 
#include 
int main(int argc, char* argv[]) {
  if (!isatty(fileno(stdin))) {
    int i = 0;
    char pipe[65536];
    while(-1 != (pipe[i++] = getchar()));
    fprintf(stdout, "piped content: >>%s<<\n", pipe);
  }
}

\n我使用以下命令编译它:\n

gcc -o my-c-program my-c-program.c

\n它几乎可以工作,只是似乎总是在管道内容字符串的末尾添加了一个U+FFFD替换字符和一个换行符(虽然我理解换行符)。为什么会发生这种情况,如何避免这个问题?\n

echo "hello world" | ./my-c-program
piped content: >>hello world
�<<

\n免责声明:我对C语言完全没有经验。请对我宽容一些。

0
0 Comments

问题:如何在C语言中读取管道内容?

原因:出现替换符号是因为忘记给字符串加上NUL终止符。

解决方法:在打印文本之前,插入pipe[i-1] = '\0';语句来移除错误字符插入。需要注意的是,由于循环测试的实现方式,需要使用i-1作为空字符。

另外,pipe[i-1] = '\0'pipe[i-1] = 0;似乎都可以工作,谢谢!

如果想要不插入'\n',可以使用echo -n "test" | ./my-c-program命令。默认情况下,echo在输出的末尾插入了'\n'

0