C++ 从管道读取时的随机字符

C++ 从管道读取时的随机字符,c++,operating-system,fork,ipc,pipe,C++,Operating System,Fork,Ipc,Pipe,在以下代码中: ... 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],

在以下代码中:

    ...
    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个随机字符吗?

当您编写长度为strlen(无论什么)的消息时,不包括终止的NUL字符。因此,在另一端输出的不是C字符串,而是一组字符

内存中字符集合的后续内容完全取决于从管道中读取字符之前的内容。由于它不是C字符串(除非发生意外,如果后面的内存位置恰好已经包含NUL),您不应该使用无限制的
%s
格式说明符将其传递给
printf

这里有两种可能性。第一个是发送NUL字符和数据,如下所示:

write (fd[1], message, strlen(message) + 1);
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);
或者(可能更好)使用
read
的返回值,它告诉您读取了多少字节,例如:

write (fd[1], message, strlen(message) + 1);
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);

指向常量字符时,始终使用
常量字符*
。您没有使用
读取的返回值。这样做会给你一个暗示…@Erwald,是的。虽然在这种情况下使用管道是不寻常的,因为在读取数据之前,您知道接收端的长度。通常,您会强制执行自己的协议,例如读取单个字符,直到获得NUL。