6

次のコードで:

    ...
    char *message = "This is the message!";
    ...

    printf("Writing to file descriptor FD[%i] \n", fd[1]);
    write( fd[1], message, strlen(message));
    printf("Reading from file descriptor FD[%i] \n", fd[0]);
    read( fd[0], buffer, strlen(message));
    printf("Message from FD[%i] : \"%s\" .\n", fd[0], buffer);

次の出力が得られます:

 "This is the message!���" .

しかし、「!」を削除すると 私のメッセージから、出力にランダムな文字が含まれていません...これらの3つのランダムな文字が表示される理由は何ですか?

4

1 に答える 1

8

長さのメッセージを書くとき、それは終了するヌル文字を含みstrlen(whatever)ません。したがって、もう一方の端に出てくるのはC文字列ではなく、単なる文字のコレクションです。

メモリ内の文字のコレクションに続くものは、パイプから文字を読み取る前にそこにあったものに完全に依存します。これはC文字列ではないため(後続のメモリ位置にたまたまNULが含まれている場合を除いてprintf 、無制限の%sフォーマット指定子を使用して渡すことはできません。

ここには2つの可能性があります。1つ目は、次のようなデータとともにNUL文字を送信することです。

write (fd[1], message, strlen(message) + 1);

または(おそらくより良い)次のreadように、読み取られたバイト数を示す戻り値を使用します。

int sz = read (fd[0], buffer, sizeof(buffer));
// should probably check sz here as well.
printf ("Message from FD[%i] : \"%*s\" .\n", fd[0], sz, buffer);
于 2013-01-02T01:15:39.300 に答える