strtok , потеря данных...
От: Tosha Россия  
Дата: 30.09.05 15:07
Оценка:
Приветствую!

Есть 2-е функции примерно такого вида:
int Send(string&);
int Get(const char*,const char*,const char*);

В первой функции происходит разбор строки:
int Send(string& t)
{
try
{
    i_ddd q;
    string temp=t;
    char *type;
    type=strtor(temp.c_str(),",");
    ......
    type=strtok(NULL,",");
    ......
    // Разбор до определенного места, далее данные идут: ИМЯ, ЗНАЧЕНИЕ)
    .....
    //Обработка ИМЯ, ЗНАЧЕНИЕ до конца строки
    do
    {
        .....
        q.Name=strtok(NULL,",");
        q.Value=strtok(NULL,",");
      .....
        if (Get(q.Name.c_str(),q.Value.c_str())==0)
                printf("Error\n");
    }while(st!=NULL);
}
catch(...)
{return 0;}
}

Вопрос такой:
После возврата из функции Get, вызов оператор q.Name=strtok(NULL,","); кидает меня в catch(...).
Может это из-за того, что я ухожу из функции Send ?

С чем это может быть связано и как как это можно побороть???
Заранее спасибо.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: strtok , потеря данных...
От: Константин Ленин Франция  
Дата: 30.09.05 15:33
Оценка:
Здравствуйте, Tosha, Вы писали:

T>Приветствую!


T>Есть 2-е функции примерно такого вида:

T>
T>int Send(string&);
T>int Get(const char*,const char*,const char*);
T>

T>В первой функции происходит разбор строки:
T>
T>int Send(string& t)
T>{
T>try
T>{
T>    i_ddd q;
T>    string temp=t;
T>    char *type;
T>    type=strtor(temp.c_str(),",");
T>    ......
T>    type=strtok(NULL,",");
T>    ......
T>    // Разбор до определенного места, далее данные идут: ИМЯ, ЗНАЧЕНИЕ)
T>    .....
T>    //Обработка ИМЯ, ЗНАЧЕНИЕ до конца строки
T>    do
T>    {
T>        .....
T>        q.Name=strtok(NULL,",");
T>        q.Value=strtok(NULL,",");
T>      .....
T>        if (Get(q.Name.c_str(),q.Value.c_str())==0)
T>                printf("Error\n");
T>    }while(st!=NULL);
T>}
T>catch(...)
T>{return 0;}
T>}
T>

T>Вопрос такой:
T>После возврата из функции Get, вызов оператор q.Name=strtok(NULL,","); кидает меня в catch(...).
T>Может это из-за того, что я ухожу из функции Send ?

T>С чем это может быть связано и как как это можно побороть???

T>Заранее спасибо.
Re[2]: strtok , потеря данных...
От: Константин Ленин Франция  
Дата: 30.09.05 15:34
Оценка: +1 -1
Случайно нажал "Отправить")
Я тут посмотрел недавно описание работы strtok — ну и говно пардон)
его вообще юзать не стоит, он какой-то небезопасный)
Re: strtok , потеря данных...
От: vnp  
Дата: 30.09.05 17:43
Оценка: +1
Здравствуйте, Tosha, Вы писали:

T>Приветствую!

T>Вопрос такой:
T>После возврата из функции Get, вызов оператор q.Name=strtok(NULL,","); кидает меня в catch(...).
T>Может это из-за того, что я ухожу из функции Send ?

strtok — функция чистого C; про исключения ничего не знает, и кидать их не умеет. Вероятно, q каким-то образом испорчено. Как и почему — из кода не видно. Посмотрите в отладчике, что оно такое, и что содержит, непосредственно перед вызовом strtok.

Присоединяюсь к высказанному мнению, что применять strtok можно только в домашних заданиях по применению strtok.
Re: strtok , потеря данных...
От: Анатолий Широков СССР  
Дата: 30.09.05 19:51
Оценка: 1 (1)
strtok пишет во входную строку, поэтому не понятно, как компилятор снял константность в данном случае:

type = strtor(temp.c_str(),",");


Подозреваю, что на самом деле написано что-то вроде:

type = strtor((char*)temp.c_str(),",");


Это грязный хак. Попробуйте так:

std::vector temp(t.begin(), t.end());
type = strtor(&temp[0],",");


Некоторые реализации std::string могут реализовывать подсчет ссылок на представление, поэтому при

std::string temp = t;


в результате t и temp могут разделять одно и тоже представление и, учитывая вышесказанное, t будет "запорчен".

А так хотелось бы взглянуть на минимальный компилируемый код, а не купированный.
Re[3]: strtok , потеря данных...
От: Анатолий Широков СССР  
Дата: 30.09.05 20:17
Оценка:
Здравствуйте, Константин Ленин, Вы писали:

КЛ>Случайно нажал "Отправить")

КЛ>Я тут посмотрел недавно описание работы strtok — ну и говно пардон)
КЛ>его вообще юзать не стоит, он какой-то небезопасный)

Небезопасный в смысле не реентерабельный? Да, но, судя по реализации MS, strtok вполне можно использовать в многопотоковых приложениях:

char * __cdecl strtok (
        char * string,
        const char * control
        )
{
        unsigned char *str;
        const unsigned char *ctrl = control;

        unsigned char map[32];
        int count;

#ifdef _MT
        _ptiddata ptd = _getptd();
#else  /* _MT */
        static char *nextoken;
#endif  /* _MT */

        /* Clear control map */
        for (count = 0; count < 32; count++)
                map[count] = 0;

        /* Set bits in delimiter table */
        do {
                map[*ctrl >> 3] |= (1 << (*ctrl & 7));
        } while (*ctrl++);

        /* Initialize str. If string is NULL, set str to the saved
         * pointer (i.e., continue breaking tokens out of the string
         * from the last strtok call) */
        if (string)
                str = string;
        else
#ifdef _MT
                str = ptd->_token;
#else  /* _MT */
                str = nextoken;
#endif  /* _MT */

        /* Find beginning of token (skip over leading delimiters). Note that
         * there is no token iff this loop sets str to point to the terminal
         * null (*str == '\0') */
        while ( (map[*str >> 3] & (1 << (*str & 7))) && *str )
                str++;

        string = str;

        /* Find the end of the token. If it is not the end of the string,
         * put a null there. */
        for ( ; *str ; str++ )
                if ( map[*str >> 3] & (1 << (*str & 7)) ) {
                        *str++ = '\0';
                        break;
                }

        /* Update nextoken (or the corresponding field in the per-thread data
         * structure */
#ifdef _MT
        ptd->_token = str;
#else  /* _MT */
        nextoken = str;
#endif  /* _MT */

        /* Determine if a token has been found. */
        if ( string == str )
                return NULL;
        else
                return string;
}
Re[2]: strtok , потеря данных...
От: Tosha Россия  
Дата: 03.10.05 04:46
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>strtok пишет во входную строку, поэтому не понятно, как компилятор снял константность в данном случае:


АШ>
АШ>type = strtor(temp.c_str(),",");
АШ>


АШ>Подозреваю, что на самом деле написано что-то вроде:


АШ>
АШ>type = strtor((char*)temp.c_str(),",");
АШ>

Ага, так и написано.
АШ>Это грязный хак. Попробуйте так:

АШ>
АШ>std::vector temp(t.begin(), t.end());
АШ>type = strtor(&temp[0],",");
АШ>


Попробую.

АШ>Некоторые реализации std::string могут реализовывать подсчет ссылок на представление, поэтому при


АШ>
АШ>std::string temp = t; 
АШ>


АШ>в результате t и temp могут разделять одно и тоже представление и, учитывая вышесказанное, t будет "запорчен".


АШ>А так хотелось бы взглянуть на минимальный компилируемый код, а не купированный.

Да вообще хочу этот кусок переписать... Может получится обойтись без strtok....
Всем спасибо...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.