Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
taimag
0 / 0 / 0
Регистрация: 19.01.2013
Сообщений: 31
#1

Своя реализация strtok - C++

10.08.2013, 16:49. Просмотров 1613. Ответов 3
Метки нет (Все метки)

Здравсвуте. Пробовал делать поиск, но почему-то все время просто выдает темы где пишет что такая функция есть. Моя же задача - не используя никаких библиотек и т.д. написать свою реализацию strtok. Я могу найти отдельные слова (это очень просто) могу даже что бы каждый раз продолжать со следующего места, функция ищет начало слова и его длинну, но вот чего не могу - это скопировать слово из введенной строки. Как мне сделать так, что бы функция возвращала строку со словом и \0 в конце?

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int mString::mStringTokens(const char *source, const char *separator)
{
  static const char *lastIterator;
  if (source != 0) {
    lastIterator = source;
  }
  if (*lastIterator == 0) {
    return 0;
  }
  const char *wordBegin = lastIterator;
  const char *separatorBegin = separator;
 
  while (*wordBegin != 0) {
    while (*separatorBegin != 0) {
      if (*wordBegin == *separatorBegin) {
        int ret = wordBegin - lastIterator;
        lastIterator = wordBegin + 1;
        return ret;
      }
      ++separatorBegin;
    }
    separatorBegin = separator;
    ++wordBegin;
  }
  if (*wordBegin == 0) {
    return wordBegin - lastIterator;
  }
}


в данной реализации возвращается длинна слова. Мне нужно что бы функция была не int mString::mStringTokens(const char *source, const char *separator), а const char *mString::mStringTokens(const char *source, const char *separator)

Добавлено через 29 минут
В общем решил проблему вот так:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
const char *mString::mStringTokens(const char *source, const char *separator)
{
  static char *word = 0;
  static const char *lastIterator;
  if (source != 0) {
    lastIterator = source;
  }
  if (*lastIterator == 0) {
    free(word);
    return 0;
  }
  const char *wordBegin = lastIterator;
  const char *separatorBegin = separator;
 
  while (*wordBegin != 0) {
    while (*separatorBegin != 0) {
      if (*wordBegin == *separatorBegin) {
        int ret = wordBegin - lastIterator;
        free(word);
        word = static_cast<char*>(malloc(ret * sizeof(char)));
        mString::mStringCopy(lastIterator, word, ret);
        lastIterator = wordBegin + 1;
        return word;
      }
      ++separatorBegin;
    }
    separatorBegin = separator;
    ++wordBegin;
  }
  if (*wordBegin == 0) {
    //return wordBegin - lastIterator;
    free(word);
    return lastIterator;
  }
}


Может кто знает реализацию по-лучше? Просто не думаю то это хорошая идея - использовать выделение памяти каждый раз.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2013, 16:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Своя реализация strtok (C++):

Реализация функции strtok - C++
Добрый день. Мое задание звучит так: изучите поведение функции strtok из стандартной библиотеки. Реализуйте и...

Своя реализация new - C++
Приведите пожалуйста пример своей реализации operator new и его последующее применение в виде работающей программы, просто хотелось бы...

Своя реализация memcpy - C++
Собственно одно из заданий Дейтела это требует. Но только я столкнулся с тем что void *memcpy(void *s1, const void *s2, size_t n) ...

Собственная реализация strtok, стоит ли применить статическую переменную? - C++
Добрый день! Пришла мысль реализовать свою strtok. Хотел проконсультироваться. Следует ли в этой strtok применять статическую...

Своя реализация strcpy - не пойму где ошибка! - C++
void copy(char *p, char *q) throw (char*) { int l2 = strlen(q); //cout&lt;&lt;&quot;strlen(q)=&quot;&lt;&lt;strlen(q)&lt;&lt;&quot; strlen(p)=&quot;&lt;&lt;strlen(p)&lt;&lt;endl; ...

Использование STRTOK Разбить строку на слова, из слов составить список C++ Функция strtok - C++
Задача Дана строка слов с разделителями, в данном примере слова с пробелами Нужно, используя функцию strtok, сформировать из этих слов...

3
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
10.08.2013, 17:06 #2
taimag, вообще strtok (стандартный) использует первый аргумент (строка для разбора) как буффер. Там просто достаточно заменить символ после конца результата на '\0', всё равно там разделитель.
0
Stella
75 / 75 / 5
Регистрация: 26.02.2013
Сообщений: 224
10.08.2013, 17:18 #3
taimag, может так (как вариант):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
char* mStringTokens(const char *source, const char *separator)
{
  int ret = 0;
  static const char *lastIterator;
  if (source != 0) {
    lastIterator = source;
  }
  if (*lastIterator == 0) {
    return 0;
  }
  const char *wordBegin = lastIterator;
  const char *separatorBegin = separator;
 
  while (*wordBegin != 0) {
    while (*separatorBegin != 0) {
      if (*wordBegin == *separatorBegin) {
        ret = wordBegin - lastIterator;
        
        char * tmpstr = new char [ret+1];
        for(int i = 0; i < ret; ++i)
            tmpstr[i] = lastIterator[i];
        tmpstr[ret] = '\n';
        lastIterator = wordBegin + 1;
        return tmpstr;
    //    return ret;
      }
      ++separatorBegin;
    }
    separatorBegin = separator;
    ++wordBegin;
  }
  if (*wordBegin == 0) {
    ret = wordBegin - lastIterator;
    char * tmpstr = new char [ret+1];
    for(int i = 0; i < ret; ++i)
        tmpstr[i] = lastIterator[i];
    tmpstr[ret] = '\n';
    return tmpstr;
  //  return ret;
  }
 
  char * tmpstr = new char [ret+1];
  for(int i = 0; i < ret; ++i)
      tmpstr[i] = lastIterator[i];
  tmpstr[ret] = '\n';
  return tmpstr;
}
Там правда копирование лучше отдельной функцией или strcpy использовать.
0
taimag
0 / 0 / 0
Регистрация: 19.01.2013
Сообщений: 31
10.08.2013, 20:22  [ТС] #4
Тему можно закрыть.
0
10.08.2013, 20:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2013, 20:22
Привет! Вот еще темы с ответами:

strtok - C++
Почему так работает #include &lt;stdafx.h&gt; #include &lt;conio.h&gt; using namespace std; int main(){ char string = &quot;a string, of ,...

strtok - C++
как с помощью функции strtok вывести последнее слово

strtok - C++
Привет! Решаю задачку на строки char. Возникла проблема вот код: //vuravnivanie slov po levomy i pravomy pol9m stranicu ...

strtok - C++
Скажите, если ли функция, аналог strtok, для типа string?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.