· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.A&O —› Нахождение подстроки в строке

<< . 1 . 2 . 3 . >>

Посл.отвђт Сообщенiе


Дата: Авг 27, 2003 23:45:24

volodya
Если ее сейчас класть на сайт - я бы там кое-что пересмотрел.
Пересмотри :).


Дата: Авг 27, 2003 23:56:02

Aquila

Serrgio пока не пускает. А я над второй частью упаковщиков работаю...


Дата: Авг 28, 2003 00:19:08

volodya
Serrgio пока не пускает.
В смысле? На сайт выкладывать?
Serrgio пока не пускает. А я над второй частью упаковщиков работаю...
В следующий раз не отдавай её в тот журнал, а то WASM'у её не видать! :)


Дата: Авг 28, 2003 00:36:24

volodya

Статья интересная, но прилично покоцаная-нет картинок.
Значит ты используешь Vtune?


Дата: Авг 28, 2003 03:27:33

Aquila

Тебе повезло, что тебя Serrgio не слышит ;) Что там с моим письмом?

Asterix

Да. + BoundsChecker.


Дата: Авг 29, 2003 00:39:40 · Поправил: volodya

Возвращаясь к нашим баранам - вот код на С. Но он мне не нравится, т.к. аллоцируется память. Надо бы как-то это дело сделать виртуальным...
void BadDelSpace(char *s)
{
	char *dst = NULL;
	
	dst = (char *)calloc(strlen(s), sizeof(char));
	do
	{
      if(*s!=' ')
	  {
		*dst = *s;
		dst++;
	  }
	}while(*++s);
}


Проверку на пустую строку я тоже пока не делаю.
Более того, dst в конце показывает на КОНЕЦ, а не на начало - для этого нужен счетчик, что-то это мне окончательно перестало нравится...


Дата: Авг 29, 2003 16:17:46

Я заглянул.. Но:

1. Зачем тебе пробелы убирать?
2. Разве командная строка может быть БОЛЬШОЙ?
3. А зачем вообще тебе пробелы убирать?
4. Зачем тебе конечный автомат? Это же не компилятор!!!


Это лишняя операция. Если ты хочешь оптимальности, то не делай лишние движения.

Вот стандартный парсинг командной строки.

-opt -option:NO -opt:"YES"

===========================================

Схема простого анализатора:

- Таблица реакций
- Цикл выборки
- Реакции
- Вспомогательные функции, которые перемещают указатель в строке

- Таблица реакций может и не быть...
потому что всё можно реализховать в цикле выборки
               lodsb
               sub al,STRL_SYMBOL ;; Символы возврата строки?
               jb error
               ja next
 
........
               cmp al,'-'
               je option

option:
                call next_char
                Определение какая это опция..

===============================================


Дата: Авг 29, 2003 17:33:33

Edmond

Мне не надо парсить коммандную строку, для этого давно есть библиотеки. Мне надо убрать все пробелы из строки. Ни более, ни менее - все варианты расписаны в самом начале топика.


Дата: Авг 29, 2003 19:12:58

void DelSpace(char*s)
{
  char *dst = NULL;

  if(s&&*s)
  {
    dst=s;

    do
	{
      if(*s!=' ')
	  {
		*dst = *s; //вот тут я получаю exception
		dst++;
	  }
	}while(*++s);

  }
}


И не могу понять, в чем дело. Поинтер валиден, а записывать не хочет :(


Дата: Авг 29, 2003 19:34:42

Вот еще один вариант:
char *trim( char *s )
{
    char *sEOS = NULL;

    // Set pointer to end of string to point to the character just
    // before the 0 at the end of the string.
    sEOS = s + strlen(s) - 1;

    while(sEOS >= s && *sEOS == ' ' )
        *sEOS-- = '\0';
	
	while(*s == ' ')
		s++;

	return s;
}


И точно также получаю exception на *sEOS-- = '\0';


Дата: Авг 31, 2003 06:15:34

volodya
Проблема вовсе не в коде, а в дебаггере (за что я этот дебаггер MS не жалую). Попробуй скомпилить под релиз и возрадуйся жизни :)

Кстати, если строку объявить как массив символов:
char stroka[] = {'A','B','C','\0'}; // Дебаггер позволяет модифицировать
char *stroka = "ABC"; // Дебаггер умничает

На всякий случай привожу полный код:
char* DelSpace(char*);
int main(int argc, char* argv[]){
 printf("DelSpace: %s", DelSpace("Let's get rid of spaces"));
 return 0;
}

char* DelSpace(char* str){
 char *ret = str, *dst;
 if(!str) return 0;
 for(dst = str; *str; str++){
  if(*str != ' ') *dst++ = *str;
 }
 *dst = '\0';
 return ret;
}


Дата: Авг 31, 2003 18:37:43

Quantum

Уряяя!!! Спасибо!!! Прогнать просто так у меня ума не хватило. Подумал, что если уж под отладчиком глючит, то без него просто слетит и все :( Спасибо!


Дата: Сен 2, 2003 22:21:26

Хрен там ура, не пашет ни хера. О, рифма какая!


Дата: Сен 2, 2003 23:21:56

Quantum
char *stroka = "ABC";

Это организация ссылки на константное выражение, соответственно в debug-версии при попытки записи в область константы выплывет исключение (можно проследить при отладке источник исключения). Соответственно в release-версии все проверки будут убраны и никаких исключений мы не увидим.

Несомненно это глюк компилятора потому что выше приведенная строка является небезопасным приведением типа и она эквивалентна
const char constStr[] = "ABC";
char *str = constStr;

при попытки скомпилировать эти две строки вы получите ошибку на стадии компиляции, меж тем получается, что компилятор рассматривает это выражение как
const char constStr[] = "ABC";
char *str = (char*) constStr;


На самом деле для данного примера нужно записать
char str[] = "ABC";


Дата: Сен 2, 2003 23:58:12

Fixer
Спасибо, что подтвердили моё предположение. IMO, более строгий компилер мог бы класть константы (вроде нашей строки "ABC") в отдельную секцию с ограничением на запись. Правда, использование подобной секции (воплощение .CONST) повлекло бы за собой значительные издержки в размере PE.

На самом деле для данного примера нужно записать
char str[] = "ABC";

Да, я так и написал (см. предыдущий пост)

<< . 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.038