6

私はこれを行うことができるようにしたい:

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

stdin が tty かどうかを検出するためisattyに使用する必要があることはわかっています。tty でない場合は、パイプされた内容を読み上げたいと思います — 上記の例では、それは stringhello worldです。

Cでこれを行うための推奨される方法は何ですか?

これが私がこれまでに得たものです:

#include <stdio.h>
#include <unistd.h>

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);
  }

}

私はこれを使用してコンパイルしました:

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

パイプされたコンテンツ文字列の最後に U+FFFD REPLACEMENT CHARACTER と改行を常に追加しているように見えることを除いて、ほとんど機能します。なぜこのようなことが起こるのでしょうか? また、この問題を回避するにはどうすればよいでしょうか?

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

免責事項:私は C の経験がまったくありません。お手柔らかにお願いします。

4

1 に答える 1

8

文字列を NUL で終了するのを忘れたため、置換記号が表示されます。

デフォルトでは、出力の最後にecho挿入されるため、改行があります。'\n'

挿入したくない場合は、'\n'これを使用します。

echo -n "test" | ./my-c-program

そして、間違った文字挿入を削除するには

pipe[i-1] = '\0';

テキストを印刷する前に。

i-1ループ テストを実装した方法のため、ヌル文字として使用する必要があることに注意してください。あなたのコードiでは、最後の文字の後にもう一度インクリメントされます。

于 2013-04-30T18:02:57.353 に答える