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

Выделение слов из массива строк - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.76
OVERPOWER8
 Аватар для OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
20.12.2009, 02:17     Выделение слов из массива строк #1
В общем, написал программу, которая из введенных_пользователем_символов извлекает слова.
Написал на 99%, но в некоторых местах допустил ошибки и не знаю, как их исправить.

Подскажите, как доработать программу.

Спасибо.

Вот код, с подробными комментариями:

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
59
60
61
62
63
64
65
66
67
68
69
using namespace std;
#include <iostream>
#include <ctype.h>
#include <string.h>
 
bool GetWord(char* string, char* word, int& worfOffset);
 
int main()
{
    const int bufferSize = 256;
    char buffer[bufferSize+1];  // Переменная для хранения всей строки
    char word[bufferSize+1];    // для хранения слова
    int wordOffset = 0;         // начинаем с первого символа
    
    cout << "Enter a string\n-> ";
    cin.getline(buffer, bufferSize);
    
    while (GetWord(buffer, word, wordOffset) )
        cout << "Got to this word: " << word << endl;
    
    return 0;
}
 
// Функция для выделения слова из строки символов:
 
bool GetWord(char* string, char* word, int& wordOffset)
{
    if(!string[wordOffset])     // Определяет ли конец?
    return false;
    
    char *p1, *p2;
    p1 = p2 = string+wordOffset;    // указатель на слудующее слово
    
    // удаляем пробелы
    for(int i=0; i<(int)strlen(p1) && !isalnum(p1[0]); i++)
        p1++;
    
    // Проверка наличия слова
    if(!isalnum(p1[0]))
    return false;
    
    // Указатель p1 показывает начало следующего слова
    // так же как и p2
 
    p2=p1;
 
    // перемещаем p2 в конец слова
    while(isalnum(p2[0]))
        p2++;
 
    // p2 указывает на конец слова
    // а p1 - в начало
    // разность указателей показывает длину слова
    int len = int (p2-p1);
    
    // копируем слово в буфер:
    strcpy(word, p1, len);
    
    // и добавляем символ разрыва строки:
    word[len] = '\ 0';
    
    // Ищем начало следующего слова
    for(int i=int(p2-string); i<(int)strlen(string) && !isalnum(p2[0]); i++)
        p2++;
        
    wordOffset = int(p2-string);
 
    return true;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
20.12.2009, 16:05     Выделение слов из массива строк #2
может вам написать код на си++ ? там около 10 строк будет..
OVERPOWER8
 Аватар для OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
20.12.2009, 17:08  [ТС]     Выделение слов из массива строк #3
>> outoftime

ХММ........ Ну на С++ как бы и надо, а у меня на каком языке написано?
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
20.12.2009, 17:13     Выделение слов из массива строк #4
допустим, что разделители слов - пробелы, тогда:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <sstream>
 
using namespace std;
 
int main()
{
    string s;
    stringstream tmp;
    getline(cin,s);
    tmp << s;
    while (tmp >> s)
    {
        cout << s << endl;
    }
}
http://codepad.org/ciqW7Tn2
OVERPOWER8
 Аватар для OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
20.12.2009, 18:22  [ТС]     Выделение слов из массива строк #5
>> outoftime
Спасибо, конечно, но в слове должна быть хотя бы одна буква(алфавитный символ).

Добавлено через 12 минут
Вот, как надо:

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
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <ctype.h>
#include <string.h>
 
using namespace std;
 
bool GetWord(char* string, char* word, int& worfOffset);
 
int main()
{
        const int bufferSize = 256;
    char buffer[bufferSize+1] = {0};      // Переменная для хранения всей строки
    char word[bufferSize+1] = {0};        // для хранения слова
        int wordOffset = 0;                     // начинаем с первого символа
        
        cout << "Enter a string\n-> ";
        cin.getline(buffer, bufferSize);
        
        while (GetWord(buffer, word, wordOffset) )
                cout << "Got to this word: " << word << endl;
        
        return 0;
}
 
// Функция для выделения слова из строки символов:
 
bool GetWord(char* string, char* word, int& wordOffset)
{
        if(!string[wordOffset])         // Определяет ли конец?
        return false;
        
        char *p1, *p2;
        p1 = p2 = string+wordOffset;    // указатель на слудующее слово
        
        // удаляем пробелы
        for(int i=0; i<(int)strlen(p1) && !isalnum(p1[0]); i++)
                p1++;
        
        // Проверка наличия слова
        if(!isalnum(p1[0]))
        return false;
        
        // Указатель p1 показывает начало следующего слова
        // так же как и p2
 
        p2=p1;
 
        // перемещаем p2 в конец слова
        while(isalnum(p2[0]))
                p2++;
 
        // p2 указывает на конец слова
        // а p1 - в начало
        // разность указателей показывает длину слова
        int len = int (p2-p1);
        
        // копируем слово в буфер:
        strncpy(word, p1, len);
        
        // и добавляем символ разрыва строки:
        word[len] = '\0';
        
        // Ищем начало следующего слова
        for(int i=int(p2-string); i<(int)strlen(string) && !isalnum(p2[0]); i++)
                p2++;
                
        wordOffset = int(p2-string);
 
        return true;
}
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
20.12.2009, 18:33     Выделение слов из массива строк #6
я тебя не понял, зачем мараться если уже все написано, на худой конец делай проверку не пуста ли строка и все..
OVERPOWER8
 Аватар для OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
20.12.2009, 21:09  [ТС]     Выделение слов из массива строк #7
Цитата Сообщение от outoftime Посмотреть сообщение
я тебя не понял, зачем мараться если уже все написано, на худой конец делай проверку не пуста ли строка и все..
Ваша программа галимая - она за слово воспринимает любой символ или набор символов, например: "*/2*?:"3Э". А моя программа извлекает именно СЛОВА, т. е. наборы алфавитных символов, и пропускает фигню всякую.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
20.12.2009, 21:32     Выделение слов из массива строк #8
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
#include <iostream>
#include <string>
#include <sstream>
#include <set>
 
using namespace std;
 
int main()
{
    set <char> S;
    for (int i = 0; i < 26; ++i)
        S.insert(i+'A');
    for (int i = 0; i < 26; ++i)
        S.insert(i+'a');        
    string s;
    multiset <string> ms;
    getline(cin,s);
    int posn = 0, posk = 0;
    while (posn < int(s.size()) && posk < int(s.size()))
    {
        if (S.find(s[posk]) != S.end()) ++posk;
        else
        {
            if (posn != posk) ms.insert(s.substr(posn,posk-posn));
            posn = ++posk;
        }
    }
    for (multiset <string> :: iterator it = ms.begin(); it != ms.end(); ++it)
        if (*it != "") cout << *it << endl;
    system("pause");
}
Добавлено через 2 минуты
http://codepad.org/2t0iqszl
OVERPOWER8
 Аватар для OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
20.12.2009, 22:59  [ТС]     Выделение слов из массива строк #9
>> outoftime

Вот это уже другое дело, но моя программа все-равно круче!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2009, 23:40     Выделение слов из массива строк
Еще ссылки по теме:

выделение из строки s m слов, начиная от слова номер n C++
Выделение памяти под массив строк C++
C++ Обработка слов строки без массива слов

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

Или воспользуйтесь поиском по форуму:
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
20.12.2009, 23:40     Выделение слов из массива строк #10
давайте строгую формулировку задачи вот тогда и увидим кто кого..
Yandex
Объявления
20.12.2009, 23:40     Выделение слов из массива строк
Ответ Создать тему
Опции темы

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