Функция get () в C автоматически добавляет символ NULL в конец входной строки? - PullRequest
0 голосов
/ 19 февраля 2019

Я пишу простую программу для преобразования числа (+ ve, 32-разрядного) из двоичного в десятичное.Вот мой код:

int main()
{
    int n=0,i=0;
    char binary[33];
    gets(binary);
    for (i = 0; i < 33, binary[i] != '\0'; i++)
        n=n*2+binary[i]-'0';
    printf("%d",n);
}

Если я удаляю binary[i]!='\0', то это дает неправильный ответ из-за значений мусора, но если я не делаю, это дает правильный ответ.Мой вопрос: функция gets автоматически добавляет символ '\ 0' (NULL) в конце строки или это просто совпадение?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Когда gets последний раз поддерживался (хотя и устарел) стандартом C, он имел следующее описание (§ 7.19.7.7, функция gets):

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

Это означает, что если строка прочитана из stdinбыло ровно столько, сколько или больше, чем массив, на который указывает s, gets все равно (попытался бы) добавить нулевой символ в конец строки.

Даже если вы находитесь настандартную версию компилятора или C, которая поддерживает gets, не используйте его.fgets намного безопаснее, поскольку требует размера буфера, в который записывается как параметр, и не будет записывать после его конца.Другое отличие состоит в том, что он оставит новую строку в буфере, в отличие от gets did.

0 голосов
/ 19 февраля 2019

Да, делает, записывая после конца binary[33], если это необходимо.

Никогда не используйте gets;автоматическое переполнение буфера.

См. Почему функция get так опасна, что ее не следует использовать? для получения подробной информации.

...