URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7659
[ Назад ]

Исходное сообщение
"работа strcat"

Отправлено kuzmich , 20-Окт-08 09:13 
Народ, снимите с ручника!
Не могу догнать, почему нельзя делать вот так (помечено _XXX_):

char *my_strcat(char *dest, const char *src)
{
    char *tmp = dest;

    while (*dest++ != '\0')     /* _XXX_ */
        ;
    }
    while ((*dest++ = *src++) != '\0')
        ;
    return tmp;
}

В таком виде ф-ция неправильно работает. Если же поменять на:

while (*dest != '\0')
    dest++;


то все ОК! GDB-ой ходил, вроде как в обоих случаях все одинаково, но в результате - нет!

Спасибо!


Содержание

Сообщения в этом обсуждении
"работа strcat"
Отправлено Ктото , 20-Окт-08 09:45 
В первом случае указатель останавливается за нулевым байтом (успевает увеличиться перед сравнением). Во втором случае на нулевом байте.

"работа strcat"
Отправлено from_mars , 10-Ноя-08 04:24 
если я правильно понимаю, то дело тут в:
оператор ++ имеет больший приоритет чем *, поэтому когда дело доходит, до разименовывания (*), сначала выполняется ++ и указатель успевает увеличиться.


"работа strcat"
Отправлено Andrey Mitrofanov , 10-Ноя-08 09:36 
>если я правильно понимаю, то дело тут в:
>оператор ++ имеет больший приоритет чем *, поэтому когда дело доходит, до
>разименовывания (*), сначала выполняется ++ и указатель успевает увеличиться.

Ну, типа того, только приоритет тут не причём.

Там (в первом варианте) дело в том, что и инкремент, и разимновывание выполняются до проверки (=во время вычисления) условия цикла, перед выходом из него, в частности. Т.о. когда условие в первом варианте выпоняется ("под указателем" NUL), указатель уже сдвинулся этим самым инкрементом ("первый" NUL попал в вых.строку).

О чём и ответили чуть выше.