Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];

Вниз

strtok в Паскале ?   Найти похожие ветки 

 
kopcap   (2004-02-10 14:59) [0]

Есть ли в Паскале ф-ия которая действует так-же как в C++ strtok() ???


 
Palladin   (2004-02-10 15:02) [1]

А как действует strtok?


 
SPIRIT   (2004-02-10 15:02) [2]

а как действует стрОК ???


 
kopcap   (2004-02-10 15:03) [3]

Вы чё C++ не знаете ???


 
Тимохов   (2004-02-10 15:04) [4]


> kopcap © (10.02.04 15:03) [3]

А вы что дельфи не знаете???


 
Palladin   (2004-02-10 15:05) [5]

ну во первых C++ тут и не пахнет, а во вторых не каждый программист с уклоном Delphi знает все рутинный C функции...


 
kopcap   (2004-02-10 15:05) [6]

Тимохов ©
Угу, С++ Лучше знаю


 
Тимохов   (2004-02-10 15:07) [7]


> Угу, С++ Лучше знаю

Тогда не выпендривайся и скажи, что функция должна делать...


 
kopcap   (2004-02-10 15:10) [8]

Оно делит строку на лексемы


 
Тимохов   (2004-02-10 15:12) [9]


> kopcap © (10.02.04 15:10) [8]

Штатных функций в д5 нет.


 
kopcap   (2004-02-10 15:13) [10]

Чё самому писАть надо ?


 
Palladin   (2004-02-10 15:14) [11]

Аналога в стандарных модулях нет. Есть Pos и Copy.


 
Palladin   (2004-02-10 15:14) [12]


> kopcap © (10.02.04 15:13) [10]

ну хочешь пиши, не хочешь не пиши....


 
Devel   (2004-02-10 15:16) [13]

используй TStringList(Delimiter, DelimitedText).


 
Игорь Шевченко   (2004-02-10 15:16) [14]

kopcap © (10.02.04 14:59)


> > Есть ли в Паскале ф-ия которая действует так-же как в C++
> strtok() ???


В UBPFD в разделе функции работы со строками есть strBreakApart


 
Palladin   (2004-02-10 15:20) [15]


> Devel © (10.02.04 15:16) [13]

Угу, очень производительное решение... особенно когда нужно несколько миллионов строк вида "1,2" распарсить...


 
Devel   (2004-02-10 15:28) [16]

Palladin © (10.02.04 15:20) [15]
было бы интересно увидеть более производительный алгоритм чем TStrings.SetDelimitedText.


 
Юрий Зотов   (2004-02-10 15:29) [17]

> kopcap © (10.02.04 15:10) [8]
> Оно делит строку на лексемы

Что-то мне не верится, что существует функция, которая разбивает любую строку на лексемы при произвольной входной грамматике. Это же добрый кусок компилятора получается, причем с любого языка. И все это в одной фукции?

Может, разбивает она все же не на лексемы, а на слова?


 
Devel   (2004-02-10 15:33) [18]

Вот нашел описание на с:

char *strtok(char *s1, const char *s2);

strtok()
The strtok() function can be used to break the string
pointed to by s1 into a sequence of tokens, each of which is
delimited by one or more characters from the string pointed
to by s2. The strtok() function considers the string s1 to
consist of a sequence of zero or more text tokens separated
by spans of one or more characters from the separator string
s2. The first call (with pointer s1 specified) returns a
pointer to the first character of the first token, and will
have written a null character into s1 immediately following
the returned token. The function keeps track of its position
in the string between separate calls, so that subsequent
calls (which must be made with the first argument being a
null pointer) will work through the string s1 immediately
following that token. In this way subsequent calls will work
through the string s1 until no tokens remain. The separator
string s2 may be different from call to call. When no token
remains in s1, a null pointer is returned.


 
esu   (2004-02-10 15:38) [19]

MSDN
strtok, wcstok, _mbstok
Find the next token in a string.
char *strtok( char *strToken, const char *strDelimit );

Вообщем самому писать нужно, если хочется что бы быстро работало.


 
Игорь Шевченко   (2004-02-10 15:47) [20]

/***
*strtok.c - tokenize a string with given delimiters
*
* Copyright (c) 1989-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines strtok() - breaks string into series of token
* via repeated calls.
*
*******************************************************************************/

#include <cruntime.h>
#include <string.h>
#ifdef _MT
#include <mtdll.h>
#endif /* _MT */

/***
*char *strtok(string, control) - tokenize string with delimiter in control
*
*Purpose:
* strtok considers the string to consist of a sequence of zero or more
* text tokens separated by spans of one or more control chars. the first
* call, with string specified, returns a pointer to the first char of the
* first token, and will write a null char into string immediately
* following the returned token. subsequent calls with zero for the first
* argument (string) will work thru the string until no tokens remain. the
* control string may be different from call to call. when no tokens remain
* in string a NULL pointer is returned. remember the control chars with a
* bit map, one bit per ascii char. the null char is always a control char.
*
*Entry:
* char *string - string to tokenize, or NULL to get next token
* char *control - string of characters to use as delimiters
*
*Exit:
* returns pointer to first token in string, or if string
* was NULL, to next token
* returns NULL when no more tokens remain.
*
*Uses:
*
*Exceptions:
*
*******************************************************************************/

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;
}


 
Владислав   (2004-02-10 18:56) [21]

> Devel © (10.02.04 15:28) [16]

Да в общем не вопрос... Особенно, если учесть Юрий Зотов © (10.02.04 15:29) [17].


 
Юрий Зотов   (2004-02-10 19:21) [22]

А-а-а, ну тогда с так называемыми "лексемами" все ясно и я могу ответить на исходный вопрос примерно так:

> Есть ли в Паскале ф-ия которая действует так-же
> как в C++ strtok() ???

Нет, в стандартную библиотеку самого Паскаля такая функция не входит. Но, тем не менее, она есть у каждого паскалиста - если не на диске, то в голове уж наверняка. Потому что написание подобных функций входит в стандарт первого месяца обучения языку Паскаль.


 
Владислав   (2004-02-10 19:40) [23]

> Юрий Зотов © (10.02.04 19:21) [22]

Прикольный ответ ;)


 
Alex Konshin   (2004-02-10 23:05) [24]

У меня в юните StringConv.pas есть несколько функций на эту тему, они еще в добавок кавычки и апострофы особым образом понимают. Большинство функций на basm, слабо комментированы, но если очень хочется, то использовать можно.
Сам этот юнит можно найти в нескольких моих примерах или в файле Flarp.zip, ну а сам этот файл на моем сайте.



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.008 c
3-5985
nomad
2004-02-03 13:06
2004.03.03
Oracle 8 и Oracle 9


1-6133
Alexadna
2004-02-19 16:13
2004.03.03
Table.State


1-6052
Курдль
2004-02-18 18:10
2004.03.03
Обнаружена ошибка в TImage! (Или в моей дезоксирибонуклеиновой)


1-6046
ARTOSHKA
2004-02-19 01:50
2004.03.03
Перехват панели часов


1-6085
dr Tr0jan
2004-02-19 05:58
2004.03.03
Отражение процесса копирования файла.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский