Завершить строку, полную мусора? - PullRequest
0 голосов
/ 11 сентября 2010

Позволяет ли C поместить разделитель строки в конце байтов чтения, заполненных мусором, или это гарантируется, только если байты чтения являются символами?

Мне нужно прочитать что-то подобное из stdin, но я не знаю, сколько символов читать, и EOF не гарантируется:

Hello World!---full of garbage until 100th byte---
char *var = malloc(100 + 1);

read(0, var, 100); // read from stdin. Unfortunately, I do not know how many bytes to read and stdin is not guaranteed to hold an EOF. (I chose 100 as an educated guess.)

var[100] = '\0'; // Is it possible to place a terminator at the end if most of the read bytes are garbage ?

Ответы [ 2 ]

8 голосов
/ 11 сентября 2010

read() возвращает количество символов, которые были фактически прочитаны в буфер (или <0 в случае ошибки). Следовательно, должно работать следующее: </p>

int n;
char *var = malloc(100 + 1);
n = read(0, var, 100);
if(n >= 0)
   var[n] = '\0';
else
   /* error */
1 голос
/ 11 сентября 2010

Возможно поставить терминатор в конце, но конечным результатом может быть Hello World! и длинный мусор после этого.

Байты всегда являются символами. Если вы хотите принимать только печатаемые символы (которые, во всяком случае, может содержать мусор в конце), вы можете прочитать ввод по одному символу за раз и проверить, находится ли значение каждого байта между 0x20 и 0x7E.

Хотя это гарантированно работает только со строками ASCII ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...