AnsiString Split(AnsiString text, AnsiString symbol,AnsiString symbol_end , int symbol_num){
AnsiString line = text;
char *l = line.c_str();
int num=0;
int start=0; //тут с text всё еще нормально, как и должно быть
for(start=0;(num<symbol_num && start<line.Length());++start){
if(l[start]==symbol.c_str()[0]){
++num;
}
}
int end=start+1;
num=0; //тут с text всё еще нормально
if(symbol_end=="_end"){
end = line.Length();
}
else{
for(end=start+1;(num<1 && end<line.Length());++end){
if(l[end]==symbol_end.c_str()[0]){
++num;
}
}
}//тут с text всё еще нормально
AnsiString h = text;
h = h.SubString(start+1,end-start-1);//тут с text всё еще нормально
for(int g=0;g<line.Length();++g){
l[g]=NULL;
} //а теперь text="" ПУСТО!!!
return h;
}
--------------------------------------------------------
CHAR и глюки в памяти
--------------------------------------------------------
Код:
как объяснить затирание в памяти содержания переменной text ???
for(int g=0;g<line.Length();++g){
l[g]=NULL;
}
char *l = line.c_str();
Возвращает указатель на char;
l[g]=NULL;
Этим ты затираеш данные используемые line;
PS
Учите мат часть :)
Для обращения к символам строки используй "line ". char* же никогда не используй, за исключением тех случаев, когда без него не обойтись!!!
А если серьёзно, то....
Цитата:
AnsiString line = text;
//.... Код, в котором отсутствуют изменения line и text
for(int g=0;g<line.Length();++g){
l[g]=NULL;
} //а теперь text="" ПУСТО!!!
Дело в том, что AnsiString - это не просто контейнер для char* - указателя на массив строк. О том, как реализуется управление памятью в этом классе, читайте здесь - http://www.codenet.ru/progr/bcb/ansistring.php
То есть, объекты line и text содержат указатели на один и тот же массив строк. А его как раз и обнуляют :eek:
--------------------------------------------------------
[/QUOTE]
При размещении сообщений в данной ветке форума использование тега форматирования [ code ][ code ] является обязательным.