То, что возвращает read(2)
, не \0
завершено, поэтому вы не можете использовать его как строку для дескриптора формата %s
напрямую.
Если вы резервируете место в буфере для нулевого терминатора, вы может прочитать данные (вы можете передать write(2)
a один вычтенный размер буфера, а затем взять число байтов, возвращаемых read()
, и поместить в это смещение \0
char.
int n = read(socket, buffer, sizeof buffer - 1);
/* check n < 0 for errors */
if (n < 0) {
ERROR("read: errno = %d\n", errno);
/* ... whatever more */
}
buffer[n] = '\0'; /* add a \0 at end of filled data */
printf("Buffer read: %s\n", buffer); /* now it is ok. */
или, если вы не хотите иметь место, чтобы добавить свой собственный \0
,
printf("Buffer read: %.*s\n", n, buffer);
, который позволяет вам передавать количество символов в вашем буфере. printf
не будет go продолжать поиск символов, поэтому нет необходимости, чтобы буфер был \0
закончен.
note
Все это предполагает, что вы читаете текстовые данные, а не двоичный файл. Если это так, то наиболее вероятным является то, что вы вообще не можете printf(3)
это сделать, так как 0x00
байт прервет печать, а управляющие символы будут sh полностью перемещать ваш экран.