Всегда ли fgets () завершает строку, возвращаемую нулем? - PullRequest
1 голос
/ 30 марта 2010

Это безопасно сделать? fgets завершает буфер с нулем или я должен установить нулевой 20-й байт после вызова на fgets и перед тем, как я вызову clean?

// strip new lines
void clean(char *data)
{
    while (*data)
    {
        if (*data == '\n' || *data == '\r') *data = '\0';
        data++;
    }
}

// for this, assume that the file contains 1 line no longer than 19 bytes
// buffer is freed elsewhere
char *load_latest_info(char *file)
{
    FILE *f;
    char *buffer = (char*) malloc(20);
    if (f = fopen(file, "r"))
        if (fgets(buffer, 20, f))
        {
            clean(buffer);
            return buffer;
        }
    free(buffer);
    return NULL;
}

Ответы [ 2 ]

4 голосов
/ 30 марта 2010

Да fgets() всегда правильно обнуляет буфер. Из справочной страницы :

Функция fgets () считывает самое большее на один символ меньше, чем количество символов, указанное в n , из указанного потока и сохраняет их в строке s, Чтение останавливается, когда обнаружен символ новой строки в конце файла или в ошибке. Новая строка, если таковая имеется, сохраняется. Если какие-либо символы читаются и ошибки нет, символ '\0' добавляется в конец строки.

0 голосов
/ 25 марта 2015

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

...