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 ?
С чем это может быть связано и как как это можно побороть???
Заранее спасибо.
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>Заранее спасибо.
Здравствуйте, Tosha, Вы писали:
T>Приветствую! T>Вопрос такой: T>После возврата из функции Get, вызов оператор q.Name=strtok(NULL,","); кидает меня в catch(...). T>Может это из-за того, что я ухожу из функции Send ?
strtok — функция чистого C; про исключения ничего не знает, и кидать их не умеет. Вероятно, q каким-то образом испорчено. Как и почему — из кода не видно. Посмотрите в отладчике, что оно такое, и что содержит, непосредственно перед вызовом strtok.
Присоединяюсь к высказанному мнению, что применять strtok можно только в домашних заданиях по применению strtok.
Здравствуйте, Константин Ленин, Вы писали:
КЛ>Случайно нажал "Отправить") КЛ>Я тут посмотрел недавно описание работы 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;
}
Здравствуйте, Анатолий Широков, Вы писали:
АШ>strtok пишет во входную строку, поэтому не понятно, как компилятор снял константность в данном случае:
АШ>
АШ>type = strtor(temp.c_str(),",");
АШ>
АШ>Подозреваю, что на самом деле написано что-то вроде:
АШ>
АШ>type = strtor((char*)temp.c_str(),",");
АШ>
Ага, так и написано. АШ>Это грязный хак. Попробуйте так:
АШ>
Попробую.
АШ>Некоторые реализации std::string могут реализовывать подсчет ссылок на представление, поэтому при
АШ>
АШ>std::string temp = t;
АШ>
АШ>в результате t и temp могут разделять одно и тоже представление и, учитывая вышесказанное, t будет "запорчен".
АШ>А так хотелось бы взглянуть на минимальный компилируемый код, а не купированный.
Да вообще хочу этот кусок переписать... Может получится обойтись без strtok....
Всем спасибо...