получает () функцию и '\ 0' нулевой байт на входе - PullRequest
1 голос
/ 21 февраля 2011

Остановится ли функция gets() на языке C (например, из glibc), если он читает нулевой байт ('\0') из файла?

Быстрый тест: echo -ne 'AB\0CDE'

Спасибо.

PS Этот вопрос возникает из комментариев к этому вопросу: возврат в libc - проблема

PPS gets функция опасна, но этовопрос о самой функции, а не о том, должен ли кто-либо ее использовать или нет.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2011

Поведение gets() состоит в том, что он останавливается, когда встречается символ новой строки или EOF.Ему все равно, читает ли он \0 байт.

Стандарт C99, 7.19.7.7

Сводка

   #include <stdio.h>

   char *gets(char *s);

Описание

Функция gets считывает символы из входного потока, на который указывает stdin, в массив, на который указывает s, до тех пор, пока не встретится конец файла или новыйсимвол строки читается.Любой символ новой строки отбрасывается, и нулевой символ записывается сразу после последнего прочитанного в массив символа.

Из документации GNU libc: http://www.gnu.org/software/libc/manual/html_node/Line-Input.html#Line-Input

- Устаревшая функция: char * gets (char *s)

Функция gets читает символы из потока stdin до следующего символа новой строки и сохраняет их в строке s.Символ новой строки отбрасывается (обратите внимание, что это отличается от поведения fgets, которое копирует символ новой строки в строку).Если get встречает ошибку чтения или конец файла, он возвращает нулевой указатель;в противном случае возвращается s.

1 голос
/ 21 февраля 2011

Не остановится на нулевом байте.

$ cat gets22.c
int main(int argc, char **argv) {
  char array[8];
  gets(array);
  printf("%c%c%c%c%c%c%c\n",array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]);
  printf("%d %d %d %d %d %d %d\n",array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]);
}

$ gcc gets22.c  -o gets22

$ echo -ne 'AB\0CDE'| ./gets22
ABCDE
65 66 0 67 68 69 0
...