Я прохожу через K & R, и у меня возникают трудности с увеличением указателей. Упражнение 5.3 (стр. 107) просит написать функцию strcat с помощью указателей.C указатели: разница между while (* s ++) {;} и while (* s) {s ++;}
В псевдокоде, функция выполняет следующие действия:
- принимает 2 строки в качестве входов.
- Находит конец строки один.
- Копии строки два на конце строки один.
я получил рабочий ответ:
void strcats(char *s, char *t)
{
while (*s) /* finds end of s*/
s++;
while ((*s++ = *t++)) /* copies t to end of s*/
;
}
Но я не понимаю, почему этот код не работает также:
void strcats(char *s, char *t)
{
while (*s++)
;
while ((*s++ = *t++))
;
}
Очевидно, что я что-то упускаю о том, как увеличивается инкремент указателя. Я думал, что две формы приращения s эквивалентны. Но второй код выводит только строку s.
Я попробовал фиктивную переменную i, чтобы проверить, проходила ли функция через оба цикла. Так оно и было. Я прочитал разделы 5.4 и 5.5 из K & R, но я не мог найти ничего, что проливает свет на это.
Может кто-нибудь помочь мне выяснить, почему вторая версия моей функции не делает то, что я бы хотел? Благодаря!
Редактировать: Спасибо всем. Невероятно, как долго вы можете смотреть на относительно простую ошибку, не замечая ее. Иногда нет лучшего средства, кроме того, что кто-то еще заглядывает в него.
Хотя K & R широко рассматривается как C-Библия, это нехорошее место, чтобы научиться писать хороший код. Такие вещи, как 'while (* s ++ = * t ++),' должны быть отправлены в мусорную корзину истории. –