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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Street1
0 / 0 / 0
Регистрация: 21.04.2012
Сообщений: 2
#1

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

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

Задание:
Задана строка 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2012, 12:59
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Использование vector<string> (C++):

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

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

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

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

Vector and string - C++
#include &lt;vector&gt; #include &lt;iostream&gt; using namespace std; int main(void) { vector&lt;string&gt; v(10); string st; ...

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

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

проблема у тебя в том, что сишный char -- это строго один байт, а в юникоде один русский символ -- это два байта
0
Street1
0 / 0 / 0
Регистрация: 21.04.2012
Сообщений: 2
25.04.2012, 10:29 #3
Вопрос решен, спасибо, за подсказку)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2012, 10:29
Привет! Вот еще темы с ответами:

Vector в string - C++
Какой самый удачный способ преобразовать вектор в строку?

Заменить использование istringstream на вариант из string или string.h - C++
Как заменить 14 строку функцией из &lt;string&gt; или &lt;string.h&gt; и без &lt;sstream&gt; {deleted} П.5.19.Правил Запрещено создавать темы в виде...

Не обнуляется vector<string> - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; #include &lt;string&gt; using namespace std; ...

Vector<set<string>> - C++
это кусок программы где я из массива string переписываю слова в вектор элементами которого являются строковые множества. функция strcomp...


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

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

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