Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
Street1
1

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

24.04.2012, 12:59. Показов 2915. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задание:
Задана строка 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;
}
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2012, 12:59
Ответы с готовыми решениями:

Не могу вставить элемент в second(vector) мультимапа. multimap<string, vector<string>>
#include &lt;iostream&gt; #include &lt;map&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; #include &lt;string&gt;...

Доступ к паре в map<string, vector<pair<string, string>>>Temp
Подскажите пожалуйста как получить данные в векторе пар ? void showData(const map&lt;string,...

Перенос данных c vector<string> в vector<double>
Необходимо перенести введенные данные в vector&lt;string&gt; в vector&lt;double&gt;, я реализовал это вот так:...

Какое одинаковое значение можно вернуть из функций <string> f () и vector < <string> > f()?
Понятное дело, что всё обсуждение будет вертеться вокруг аналога NULL. char* f_0 () { return...

2
387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
24.04.2012, 18:30 2
попробуй в консольке включить какую-нибудь однобайтную раскладку (например, koi8-r)

проблема у тебя в том, что сишный char -- это строго один байт, а в юникоде один русский символ -- это два байта
0
Street1
25.04.2012, 10:29 3
Вопрос решен, спасибо, за подсказку)
25.04.2012, 10:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2012, 10:29
Помогаю со студенческими работами здесь

Как перебрать все элементы в map<string, vector<string>>
Доброго времени суток. Решаю следующую задачу: В файле есть сведения об автомобилях: марка...

Вывод элементов map <string,vector<string>>
Доброго времени суток. Как можно вывести массив map &lt;string,vector&lt;string&gt;&gt; mp ? Могу только...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же...

Vector и String
Доброго времени суток. Прошу прощения за, скорее всего, часто повторяющийся вопрос, но не могли...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru