The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"работа strcat"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"работа strcat"  
Сообщение от kuzmich (??) on 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-ой ходил, вроде как в обоих случаях все одинаково, но в результате - нет!

Спасибо!

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

  • работа strcat, Ктото, 09:45 , 20-Окт-08, (1)  
  • работа strcat, from_mars, 04:24 , 10-Ноя-08, (2)  
    • работа strcat, Andrey Mitrofanov, 09:36 , 10-Ноя-08, (3)  

Сообщения по теме [Сортировка по времени | RSS]


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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2021 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру