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

Из первой строчки убрать слова, которые встречаются во второй - C++

Восстановить пароль Регистрация
 
Pakestan228
0 / 0 / 0
Регистрация: 16.11.2013
Сообщений: 28
05.01.2014, 01:22     Из первой строчки убрать слова, которые встречаются во второй #1
Пользователь вводит с клавиатуры 2 строки. Из первой строчки убрать слова, которые встречаются во второй.
Например:

1:user,internet,soft,it
2:computer,test,soft,c++,user

3:internet,it

Вот что вышло:
C++ (Qt)
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
#include "stdafx.h"
#include "string"
#include "iostream"
#include "istream"
#include "stdio.h"
 
 
 
char* slovo(char* str, int count)   //Выбирает слово из строки
{
    int k=1;
char *strs="Error";
char * pch = strtok (str,","); 
 while (pch != NULL)                         
  {
      if(k==count)
          strs=pch;
            
            pch = strtok (NULL, ",");
 
            k++ ;
 }
 return strs;
    }
 
 
int kolvoslov(char stroka[])    //считает кол-во слов в строке
{
int kolvo=0;
 
for (int i=0;i<strlen(stroka);i++)
{
if(stroka[i]==',')
    kolvo++;
}
return kolvo+1;
}
 
 
 
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
 
//str1,2-исходные строки
char str1[256],str11[256]="",str2[256],str21[256]="",str3[256]="",str4[256];
 
//ввод пользователем 2х строк с клавиатуры(слова в строке разделены знаком ",")
printf("Stroka 1:\n");
cin.getline (str1,256);
printf("Stroka 2:\n");
cin.getline (str2,256);
 
int k1=kolvoslov(str1);
int k2=kolvoslov(str2);
for(int i=0;i<strlen(str1);i++)
str11[i]=str1[i];
for(int i=0;i<strlen(str2);i++)
str21[i]=str2[i];
 
 
int p;
for(int i=0;i<k1;i++)
{
    p=0;
    for(int j=0;j<k2;j++)   //если слово из 1 строки не совпадает со словом из 2й строки, p++
    {
        int cmp=_stricmp(slovo(str11,i),slovo(str21,j));
    for(int e=0;e<strlen(str1);e++)
        str11[e]=str1[e];
    for(int e=0;e<strlen(str2);e++)
        str21[e]=str2[e];
    if(cmp!=0)
        p++;
    }
    if(p==k2)
    {strcat(str3,",");
        strcat(str3,slovo(str11,i));
        for(int e=0;e<strlen(str1);e++)
        str11[e]=str1[e];
        }
}
 
int i=0;
while(str3[i]!='\0')    //убираем первую запятую из строки
{
str4[i]=str3[i+1];
i++;
}
 
cout << "Stroka 3:\n"<<str4;
cin.get();
 
cin.ignore();
return 0;
}
в итоге получается не совсем верная строка... в чем может быть ошибка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2014, 01:22     Из первой строчки убрать слова, которые встречаются во второй
Посмотрите здесь:

C++ Как из первой строки удалить те буквы, которые есть во второй строке?
Вывести в алфавитном порядке слова, которые присутствуют либо в первой строке, либо во второй, но не в обеих сразу. C++
Строки в С++ - вывести слова, которые встречаются один раз C++
Напечатать те слова, которые встречаются в каждом из двух заданных предложений C++
В тексте найти слова , которые встречаются больше N раз C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sentike
4 / 4 / 0
Регистрация: 22.08.2013
Сообщений: 49
05.01.2014, 04:34     Из первой строчки убрать слова, которые встречаются во второй #2
Вот, попробуй, думаю, можно было и лучше... Надеюсь поможет ..

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
#include "stdafx.h"
#include <stdio.h>
#include <cstdio>
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;
 
 
vector<string> lOne;
vector<string> lTwo;
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    std::string var;
    string buf; // Have a buffer string
    stringstream ss; // Insert the string into a stream
 
    cout << "Enter line 1:" << endl;
    //--------------------------------------------------
    std::getline (std::cin, var);
    ss = stringstream(var);
    while (ss >> buf)
        lOne.push_back(buf);
    //--------------------------------------------------
    cout << "Enter line 2:" << endl;
    std::getline (std::cin, var);
    ss = stringstream(var);
    while (ss >> buf)
        lTwo.push_back(buf);
    //--------------------------------------------------
    for (unsigned i = 0; i < lTwo.size(); ++i) 
    {
        auto it = find(lOne.begin(), lOne.end(), lTwo.at( i ));
        if(it != lOne.end())        lOne.erase(it);
    }
 
    std::string str;
    for (unsigned j = 0; j < lOne.size(); ++j) 
    {
        str.insert(str.size(), lOne.at(j));
        str.insert(str.size(), " ");
    }
 
    cout << str << endl;
    cin.get();
    return 0;
}
Pakestan228
0 / 0 / 0
Регистрация: 16.11.2013
Сообщений: 28
05.01.2014, 14:23  [ТС]     Из первой строчки убрать слова, которые встречаются во второй #3
просто выводит исходную строку(
sentike
4 / 4 / 0
Регистрация: 22.08.2013
Сообщений: 49
05.01.2014, 16:15     Из первой строчки убрать слова, которые встречаются во второй #4
Забыл, что в качестве разделитя используется ,(запятая). В моем варианте -- пробел.
Сейчас исправлю

*Исправил, попробуй.
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
#include "stdafx.h"
#include <stdio.h>
#include <cstdio>
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;
 
vector<string> lOne;
vector<string> lTwo;
 
 
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
    std::stringstream ss(s);
    std::string item;
    while (std::getline(ss, item, delim)) {
        elems.push_back(item);
    }
    return elems;
}
 
 
std::vector<std::string> split(const std::string &s, char delim) {
    std::vector<std::string> elems;
    split(s, delim, elems);
    return elems;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    std::string var;
    string buf; // Have a buffer string
    stringstream ss; // Insert the string into a stream
 
    cout << "Enter line 1:" << endl;
    //--------------------------------------------------
    std::getline (std::cin, var);
    lOne = split(var, ',');
    //--------------------------------------------------
    cout << "Enter line 2:" << endl;
    std::getline (std::cin, var);
    lTwo = split(var, ',');
    //--------------------------------------------------
    for (unsigned i = 0; i < lTwo.size(); ++i) 
    {
        auto it = find(lOne.begin(), lOne.end(), lTwo.at( i ));
        if(it != lOne.end())        lOne.erase(it);
    }
 
    std::string str;
    for (unsigned j = 0; j < lOne.size(); ++j) 
    {
        str.insert(str.size(), lOne.at(j));
        str.insert(str.size(), ",");
    }
 
    cout << str << endl;
    cin.get();
    return 0;
}
Петррр
 Аватар для Петррр
5915 / 3352 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
05.01.2014, 16:26     Из первой строчки убрать слова, которые встречаются во второй #5
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
#include <algorithm>
#include <vector>
#include <sstream>
#include <string>
#include <iostream>
 
std::vector<std::string> words(const std::string& str, const char separator)
{
    std::istringstream iss(str);
    std::vector<std::string> vec;
    std::string word;
    while (std::getline(iss, word, separator))
        vec.push_back(word);
    return vec;
}
 
int main()
{
    std::string s1("user,internet,soft,it");
    std::string s2("computer,test,soft,c++,user");
    std::vector<std::string> vec1 = words(s1, ',');
    std::vector<std::string> vec2 = words(s2, ',');
    std::sort(vec1.begin(), vec1.end());
    std::sort(vec2.begin(), vec2.end());
    std::vector<std::string> result;
    std::set_difference(
        vec1.cbegin(), vec1.cend(),
        vec2.cbegin(), vec2.cend(),
        std::back_inserter(result));
    for (std::vector<std::string>::const_iterator it = result.cbegin();
        it != result.cend();
        ++it)
    {
        std::cout << *it << std::endl;
    }
    return 0;
}
Pakestan228
0 / 0 / 0
Регистрация: 16.11.2013
Сообщений: 28
05.01.2014, 16:44  [ТС]     Из первой строчки убрать слова, которые встречаются во второй #6
Цитата Сообщение от sentike Посмотреть сообщение
Забыл, что в качестве разделитя используется ,(запятая). В моем варианте -- пробел.
Сейчас исправлю

*Исправил, попробуй.
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
#include "stdafx.h"
#include <stdio.h>
#include <cstdio>
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;
 
vector<string> lOne;
vector<string> lTwo;
 
 
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
    std::stringstream ss(s);
    std::string item;
    while (std::getline(ss, item, delim)) {
        elems.push_back(item);
    }
    return elems;
}
 
 
std::vector<std::string> split(const std::string &s, char delim) {
    std::vector<std::string> elems;
    split(s, delim, elems);
    return elems;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    std::string var;
    string buf; // Have a buffer string
    stringstream ss; // Insert the string into a stream
 
    cout << "Enter line 1:" << endl;
    //--------------------------------------------------
    std::getline (std::cin, var);
    lOne = split(var, ',');
    //--------------------------------------------------
    cout << "Enter line 2:" << endl;
    std::getline (std::cin, var);
    lTwo = split(var, ',');
    //--------------------------------------------------
    for (unsigned i = 0; i < lTwo.size(); ++i) 
    {
        auto it = find(lOne.begin(), lOne.end(), lTwo.at( i ));
        if(it != lOne.end())        lOne.erase(it);
    }
 
    std::string str;
    for (unsigned j = 0; j < lOne.size(); ++j) 
    {
        str.insert(str.size(), lOne.at(j));
        str.insert(str.size(), ",");
    }
 
    cout << str << endl;
    cin.get();
    return 0;
}
спасибо, а как сделать, чтобы регистр не учитывался?
Yandex
Объявления
05.01.2014, 16:44     Из первой строчки убрать слова, которые встречаются во второй
Ответ Создать тему
Опции темы

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