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

Использование vector<string> - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Street1
Сообщений: n/a
24.04.2012, 12:59     Использование vector<string> #1
Задание:
Задана строка S, содержащая не менее двух слов, и символ с. Составит новую строку S1 из слов строки S, в которых есть символ с, и новую строку S2 из слов строки S, в которых нет символа с. Учитывать порядок вхождения слов в строку. Входные данные: строка S произвольной длины и символ с. Для решения задачи использовать столько процессов, сколько слов в строке.

Собственно задача решена, но я наткнулся на проблему, при вводе строки в английской раскладке, проблем нет, а при вводе на русской раскладке, все слова определяются, так как будто во всех есть искомый символ, хотя вводятся и иные=(

Подскажите пожалуйста, как можно исправить эту проблему?

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include <iostream>
#include <string>
#include <stdio.h>
#include <ostream>
#include <vector>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/wait.h>
 
using namespace std;
 
#define MAX_WORDS   100     // Максимальное количество слов
#define BUF_SIZE    1024    // Максимальный размер входной строки
 
int shmid;                  // Для хранения дескриптора разделяемой памяти
int semid;                  // Для хранения дескриптора группы семафоров
sembuf Plus1 = {0, 1, 0};   // Операция прибавляет единицу к семафору с индексом 0
sembuf Minus1 = {0, -1, 0}; // Операция вычитает единицу от семафора с индексом 0
 
char searchChar;            // Искомый символ
vector<string> words;       // Вектор введенных слов
 
// Cтруктура, под которую будет выделена разделяемая память
typedef struct SHARED
{
    bool wordClass[100];    // Определяет тип слова
} *PSHARED;
 
PSHARED pShared;            // Указатель на разделяюмую память
 
// Разделяет строку на вектор подстрок, используя указанный разделитель
void SplitString(string &str, char separator, vector<string> &result)
{
    string::size_type first = 0;
    string::size_type second = str.find(separator);             // Определяет положение разделителя
 
    while (second != string::npos)                              // Пока найден разделитель
    {
        result.push_back(str.substr(first, second - first));    // Добавить подстроку между разделителями в вектор
        first = second + 1;
        second = str.find(separator, first);
    }
 
    result.push_back(str.substr(first));
}
 
// Функция, обрабатывающая слово
void ParseWord(int wordIndex)
{
    for (string::const_iterator i = words[wordIndex].begin(); i != words[wordIndex].end(); ++i) // Итерация по всем символам строки
    {
        if ((*i) == searchChar)                      // Если слово содержит искомый символ
        {   
            semop(semid, &Minus1, 1);                // Oтнять единицу от семафора
            pShared->wordClass[wordIndex] = true;    // Пометить слово как содержащее искомый символ
            semop(semid, &Plus1, 1);                 // Добавить единицу к семафору
            cout <<  words[wordIndex] << endl;
            break;
        }
    }
}
 
int main()
{
    // Запрос на создание разделяемой памяти для указателя
    shmid = shmget(IPC_PRIVATE, sizeof(struct SHARED), IPC_CREAT | 0666);
 
    // Eсли запрос оказался неудачным, завершить выполнение
    if (shmid < 0 )
    {
        cout << "Ошибка при выделении разделяемой памяти!" << endl;
        return -1;
    }
 
    // Cоздать группу семафоров, состоящую из одного семафора
    semid = semget(IPC_PRIVATE, 1, IPC_CREAT|0666);
 
    // Eсли не удалось создать группу семафоров, завершить выполнение
    if (semid < 0)
    {
        cout << "Ошибка при создании группы семафоров!" << endl;
        return -1;
    }
 
    semop(semid, &Plus1, 1);                  // Теперь семафор равен единице
    pShared = (PSHARED)shmat(shmid, NULL, 0); // Tеперь pShared указывает на выделенную разделяемую память
 
    // Чтение данных
    char szBuffer[BUF_SIZE];
    cout << "Введите строку:" << endl;
    cin.getline(szBuffer, sizeof(szBuffer) / sizeof(char));
    string buffer(szBuffer);
    SplitString(buffer, ' ', words);
 
    cout << "Введите символ:" << endl;
    cin >> searchChar;
 
    // Cоздать процессы-потомки
    for (int i = 0; i < words.size(); i++)
    {
        if (fork() == 0)    // Истинно для дочернего процесса
        {
            ParseWord(i);
            return 0;
        }
    }
 
    // Дождаться завершения процессов-потомков
    for (int i = 0; i < words.size(); i++)
    {
        wait(NULL);
    }
    // Формирование строк
    string withChar, withoutChar;
 
    for (int i = 0; i < words.size(); i++)
    {
        if (pShared->wordClass[i])
        {
            withChar += words[i] + ' ';
        }
        else
        {
            withoutChar += words[i] + ' ';
        }
    }
 
    cout << "Строка из слов с искомым символом: " << withChar << endl
         << "Строка из слов без искомого символа: " << withoutChar << endl;
 
    shmdt(pShared);
    shmctl(shmid, IPC_RMID, NULL);
    semctl(semid, IPC_RMID, NULL);
         
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2012, 12:59     Использование vector<string>
Посмотрите здесь:

C++ Vector string'ов и освобождение памяти
Vector и String C++
C++ Vector and string
Vector<set<string>> C++
Конвертация string в vector по условию C++
C++ Заменить использование istringstream на вариант из string или string.h
Конвертирование из vector<string> в map C++
C++ Не обнуляется vector<string>

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yekka
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
24.04.2012, 18:30     Использование vector<string> #2
попробуй в консольке включить какую-нибудь однобайтную раскладку (например, koi8-r)

проблема у тебя в том, что сишный char -- это строго один байт, а в юникоде один русский символ -- это два байта
Street1
Сообщений: n/a
25.04.2012, 10:29     Использование vector<string> #3
Вопрос решен, спасибо, за подсказку)
Yandex
Объявления
25.04.2012, 10:29     Использование vector<string>
Ответ Создать тему
Опции темы

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