реализация fgets (K&R)

Я новичок в программировании, начиная с Objective-C, но решил вернуться к основам, прежде чем продвигаться дальше. Я провожу некоторое время на C и борюсь с путаницей указателей. Мой вопрос о том, как K&R говорит, что fgets реализован (p165, 2nd ed.) Код ниже прямо из текста с парой моих комментариев.

char* fgets(char* s, int n, FILE *iop)
{
    register int c;
    register char* cs;
    cs = s;

    while(--n > 0 && (c = getc(iop)) != EOF)
    {
    // put the input char into the current pointer position, then increment it
    // if a newline entered, break
    if((*cs++ = c) == 'n')
        break;          
    }

    *cs = '';
    return (c == EOF && cs == s) ? NULL : s;
}

1) мы передаем символ * S функции fgets, в местоположении которой мы храним пользовательский ввод. Почему существует необходимость объявить локальную char * cs-а затем инициализировать его на s? Почему мы не можем напрямую манипулировать/добавлять в S в операторе if? Видя, что cs инициализируется в точку s, не добавляет ли символы в cs точно то же самое?

2) связанный с вышеизложенным...Когда функция возвращается, производится тест, чтобы увидеть, если cs == s. Почему это необходимо?

Я думаю, что я, возможно, пропустил что - то очень фундаментальное-я проверил так и Google, но не могу понять это. Спасибо!

1 ответов


это из-за чека на последней строке, cs == s. Это сравнение проверяет измененный указатель cs С оригиналом s чтобы узнать, читали ли мы какой-либо символ. Если мы этого не сделали, мы возвращаем NULL.

С помощью cs по всему исходному указателю есть. Если s были напрямую манипулировать (*s++ вместо *cs++) тогда нам придется найти другой способ проверить, были ли какие-либо символы прочитаны.

можно также утверждать, что это хорошая практика, чтобы оставить параметры функции в покое и рассматривать их как const. Некоторые программисты следуют этой практике, чтобы повысить четкость кода.