Форум программистов, компьютерный форум CyberForum.ru

Сделать упрощенную версию функции strtok() - C++

Восстановить пароль Регистрация
 
delexa
2 / 2 / 1
Регистрация: 02.03.2011
Сообщений: 134
19.02.2014, 00:42     Сделать упрощенную версию функции strtok() #1
Вложение 367474

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
#include <iostream>
 
using namespace std;
char *slova (char s[], bool &prodoljat);
 
int main()
{
    char  s[100];
    bool prodoljat=1;
    cin.getline(s,100);
 
 
    while ( prodoljat )
    cout<<slova(s, prodoljat)<<endl;
    
}
 
char* slova (char s[], bool &prodoljat)
{
    static int nachinat(0);
    static int count(0);
    
    char* slovo = new char[30];
    
    int i(nachinat);
 
    for (;;)
    {
        slovo[i]=s[i];
        i++;
 
        if ((s[i]==' ') || (s[i]=='\0')) break;
    }
 
    nachinat=i;
    count++;
 
    if (s[i]=='\0') 
    {
        prodoljat =0;
        count=0;
        nachinat =0;
    }
 
    return slovo ;
}
выводится с мусором. Что исправить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2014, 00:42     Сделать упрощенную версию функции strtok()
Посмотрите здесь:

strtok C++
C++ strtok
Написать рекурсивную версию функции, "перевертывающей" строку S C++
Произведение элементов для каждого из данных массивов, вызвав соответствующую версию функции C++
C++ Реализация функции strtok
Использование STRTOK Разбить строку на слова, из слов составить список C++ Функция strtok C++
C++ Как редактировать токены функции strtok?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Eldies
89 / 80 / 28
Регистрация: 06.02.2014
Сообщений: 119
19.02.2014, 01:32     Сделать упрощенную версию функции strtok() #2
1) строка 29 - слово записывается в slovo на те же позиции, где оно находится в строке. Поэтому, перед вторым и последующими словами - мусор.
2) между словами в строке - пробелы, но они в этом коде никак не пропускаются, поэтому перед вторым и последующими словами - лишний пробел.
3) чтобы после слова не выводился мусор, можно поставить символ конца строки.

Добавлено через 15 минут
Например, вот так:
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
48
49
50
#include <iostream>
 
using namespace std;
 
char* tokenize(char* str);
 
int main()
{
    char s1[] = "dfghj fghjk fghjk ghjk fghjk fghjk";
 
    char* word = tokenize(s1);
    while(word)
    {
        cout << word << "\n";
        delete[] word;
        word = tokenize(0);
    }
 
    std::system("pause");
}
 
char* tokenize(char* str)
{
    static char* string = 0;
    static int stpoint;
 
    if (str != 0)
    {
        string = str;
        stpoint = 0;
    }
 
    for( ; string[stpoint] == ' '; ++stpoint); // пропускаем начальные пробелы.
    
    if (! string[stpoint]) // если строка кончилась, вернуть 0
        return 0;
    
    int len = 0;
    for( ; string[stpoint+len] && (string[stpoint+len] != ' '); ++len); // считаем длину слова
 
    char* result = new char[len + 1]; // выделяем память под слово + символ конца строки
 
    for (int i = 0; i < len; ++i)   // копируем строку
        result[i] = string[stpoint + i];
    result[len] = 0;    // ставим символ конца строки
 
    stpoint += len; // сдвигаем место, откуда начнется поиск в следующий раз 
 
    return result;
}
delexa
2 / 2 / 1
Регистрация: 02.03.2011
Сообщений: 134
19.02.2014, 02:27  [ТС]     Сделать упрощенную версию функции strtok() #3
огромное спасибо) поправил свой код

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
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
 
using namespace std;
char *slova (char s[], bool &prodoljat);
 
int main()
{
    char  s[100];
 
    for (;;)
    {
        bool prodoljat=1;
        cin.getline(s,100);
        if (!strcmp (s,"0")) break;
 
        while ( prodoljat )
            cout<<slova(s, prodoljat)<<endl;
 
        strcpy(s,"");
    }
 
}
 
char* slova (char s[], bool &prodoljat)
{
    static int nachinat(0);
    static int count(0);
 
    char* slovo = new char[30];
 
    int i(nachinat);
 
    if (nachinat>0) i++;
    for (int k=0;;k++)
    {
        slovo[k]=s[i];
        i++;
 
        if ((s[i]==' ') || (s[i]=='\0'))
        {
            slovo[k+1]='\0';
            break;
        }
    }
 
 
    nachinat=i;
    count++;
 
    if (s[i]=='\0') 
    {
        prodoljat =0;
        count=0;
        nachinat =0;
    }
 
    return slovo ;
}
Yandex
Объявления
19.02.2014, 02:27     Сделать упрощенную версию функции strtok()
Ответ Создать тему
Опции темы

Текущее время: 23:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru