реализация 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
. Некоторые программисты следуют этой практике, чтобы повысить четкость кода.