ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 ноября
405566 Топик полностью
abivan (27.04.2013 14:07, просмотров: 108) ответил fk0 на Как в вытесняющей многозадачности сделать два параллельных strtok() ? Или как многозадачность -- так вытесняющая. А как библиотечные функции -- не используем. (можно сделать, но не на всякой libc)
да, нужна аккуратность. Либо  
-разбор делать в одной задаче
-обернуть ф-и семафором
-не использовать стандартную библиотеку, а использовать стороннюю. Я пользую pforce
ее, есно, нужно переделать под ОС, что и делается по необходимости

 rc = strtoken(token, str, separators);                 /int/
              грамматический разбор символа из строки

Описание аргументов:

    char *str;     строка (Для strdxrv() это указатель на середину строки)
    char *separators;   набор символов, которые являются символами ограничения
                        в строке. Вы должны включить пробел и табуляцию в
                   этот список, если вы хотите их использовать как разделители

    сhar *token[]; буфер, содержащий набор символов переданных из STR.
                   Первый символ - это всегда не пробел и отделен одним
                   из символов разделителей.

         Выполнение StrToken().
         ______________________

    StrToken() удаляет набор символов из вводимой  строки.  Все  лидирующие  и
конечные  пробелы  удаляются  из  STR, которая затем просматривается в поисках
символа - SEPARATOR. Все символы выбираются, не включая символ- разделитель, и
возвращаются,  как  следующая лексема в TOKEN. Разделитель и символы - лексемы
удаляются из строки. Если разделители не найдены, в TOKEN возвращается  полное
содержание STR, а STR устанавливается в нуль и возвращается RC_FAIL.
    Заметим,  что  вы должны определить пробелы и табуляции в SEPARATORS, если
вы желаете использовать их в качестве разделителей. Также заметим,  что  могут
возвращаться  пустые  символы.  Например,  если  запятая,  пробел  и  точка  -
разделители и STR содержит "a, b, c, .. d", то 5  лексем  будет  возвращено  :
"а", "b", "c", " ", "d". Четвертая лексема - пустая.

/* (c) 1985, Phoenix Computer Products Corp. and Novum Organum, Inc. */ #include "pdefs.h" strtoken(char *token, char *str, char *separators){ int off, rc; rc = RC_SUCCESS; strtrim(str); off = strinspn(separators, str); if (off>NOTFND) { strancpy(token, str, off+1); strdel(str, off); strtrim(str); if (stridxc(*str,separators)>NOTFND) { strdel(str,1); strtrim(str); } } else if (*str) { stracpy(token,str); *str = EOS; } else { *token = EOS; rc = RC_FAIL; } return (rc); }