Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/34: Рейтинг темы: голосов - 34, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 27.12.2015
Сообщений: 4

Даны две строки. Составить третью строку из слов, имеющихся в обеих данных строках

28.12.2015, 14:35. Показов 7130. Ответов 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
32
33
34
35
36
37
38
39
40
#include <string.h>
#include <iostream.h>
#include <vcl.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
void main(void)
{
 
 char s[81]={'\0'},s1[81],s2[81];
 int i;
 char temp[81]={'\0'};
 cout<<"Введите первую строку: ";
 cin.getline(s1,80);
 cout<<endl<<"Введите вторую строку: ";
 cin.getline(s2,80);
 char *pch1=strtok(s1," ,.-");
 char *pch2=strtok(s2," ,.-");
 for(;pch1!=NULL;pch1=strtok(NULL," ,.-"))
   {
     for(;pch2!=NULL;pch2=strtok(NULL," ,.-"))
       {
          if(strcmp(pch1,pch2)==0)
            {
              for(i=0;i<strlen(pch1);i++)
              {
                 if(pch1[i]=pch2[i])
                 temp[i]=pch1[i];
                 else break;
              }
            }
       }
     strcat(s," ");
     strcat(s,temp);
   }
 cout<<"Результирующая строка: "<<s<<endl;
 system("pause");
}
Проблема во внешнем цикле (for(;pch1!=NULL;pch1=strtok(NULL," ,.-"))). Он совершает только 1 проход, то-есть работает только с первым словом первой строки и всё. Подскажите, где я ошибся?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.12.2015, 14:35
Ответы с готовыми решениями:

Создать третью строку, которая должна содержать символы, присутствующие одновременно в обеих исходных строках
Ребят, подскажите как сделать.

Даны две строки. Если первая строка - длиннее, сформировать третью строку, как объединение строк
Даны две строки. Если первая строка - длиннее, сформировать третью строку, как объединение строк, иначе - скопировать первую строку во...

Даны две строки (одинаковой длины). Создайте третью строку из символов, которые на одинаковых позициях совпадают
2. Даны две строки (одинаковой длины). Создайте третью строку из символов, которые на одинаковых позициях совпадают.

8
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
28.12.2015, 14:39
ChakiFinster, Не усложняйте очевидное:

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    string str1, str2, str3;
    getline(cin, str1);
    getline(cin, str2);
    str3 = str1 + str2;
    cout << str3 << endl;
}
0
0 / 0 / 0
Регистрация: 27.12.2015
Сообщений: 4
28.12.2015, 15:30  [ТС]
Вы не поняли задание, нужно выписать совпадающие в обеих строках
0
 Аватар для Геомеханик
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
28.12.2015, 15:45
Цитата Сообщение от ChakiFinster Посмотреть сообщение
Проблема во внешнем цикле (for(;pch1!=NULL;pch1=strtok(NULL," ,.-"))). Он совершает только 1 проход, то-есть работает только с первым словом первой строки и всё. Подскажите, где я ошибся?
Здесь у тебя логическая ошибка связанная с работой функции strtok, ибо строка при первом проходе будет поделена на null terminate \0, отсюда следует что в следующем цикле будет только первое слово.

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
#include <iostream>
#include <set>
#include <cstring>
 
struct str {
    char* p;
    str(void):p(NULL){}
    str(char* _p):p(_p){}
 
    bool operator < (const str& s) const {
        return (strcmp(p, s.p) < 0);
    }
};
 
int main(void){
    const int N = 64;
    char s1[N]  = "Lisp, Apl, Pascal, Algol, Forth, Prolog.";
    char s2[N]  = "Pascal, Prolog, Ada, Apl, Lisp, Actor.";
    char s3[N+N];
 
    std::set<str> ss;
 
    const char delim[] = " \t\n.,!?";
    for(char* i = strtok(s1, delim); i != NULL; i = strtok(NULL, delim))
        ss.insert(i);
 
    char* p = &s3[0];
    for(char* j = strtok(s2, delim); j != NULL; j = strtok(NULL, delim)){
        if(ss.find(j) != ss.end()){
            if(p != s3)
                *p++ = ' ';
            while(*j)
                *p++ = *j++;
        }
    }
    *p = '\0';
    ss.clear();
    std::cout << s3 << std::endl;
    return 0;
}
Пример работы кода
1
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
28.12.2015, 16:02
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
#include <iostream>
#include <boost/algorithm/string.hpp>
#include <vector>
#include <string>
#include <algorithm>
 
using namespace std;
 
 
int main(int argc, char ** argv)
{
  string str1("String to remove duplicates in string.");
  string str2("The duplicates in strings is bad idea");
  list<string> tokens1;
  list<string> tokens2;
 
  boost::split(tokens1, str1, boost::is_any_of("\t\n:\",.;?! "));
  boost::split(tokens2, str2, boost::is_any_of("\t\n:\",.;?! "));
  tokens1.insert(tokens1.end(), tokens2.begin(), tokens2.end());
 
  for (auto &token: tokens1) {
    for (auto &ch: token)
      ch = tolower(ch);
  }
 
  tokens1.sort();
  tokens1.unique();
 
  for_each(tokens1.begin(), tokens1.end(), [](const auto &token) {
    cout << token << endl;
  });
  
  return 0;
}
0
338 / 67 / 37
Регистрация: 22.12.2010
Сообщений: 138
28.12.2015, 16:26
вот так могу предложить
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
#include <iostream>
#include <locale>
#include <vector>
#include <cstring>
 
using std::cout;
using std::cin;
using std::endl;
using std::vector;
using std::string;
 
int main() {
    setlocale(LC_ALL, "Russian");
    string myString;
    vector<string> vec1s;
    vector<string> vec2s;
    cout << "Введите слова в первый вектор (по окончанию ctrl+z):" << endl;
    while(getline(cin,myString))
        vec1s.push_back(myString);
    cin.clear();
    cout << "Введите слова во второй вектор (по окончанию ctrl+z):" << endl;
    while(getline(cin,myString))
        vec2s.push_back(myString);
    cout << "Совпавшие слова:" << endl;
    for(vector<string>::size_type i = 0; i != vec1s.size(); i++) {
        for(vector<string>::size_type j = 0; j != vec2s.size(); j++) {
            vector<string>::size_type k = vec2s[j].find(vec1s[i]);
            if (k != string::npos) {
               cout << vec2s[j] << ' ';
            }
        }
    }
    return 0;
}
Миниатюры
Даны две строки. Составить третью строку из слов, имеющихся в обеих данных строках  
1
0 / 0 / 0
Регистрация: 27.12.2015
Сообщений: 4
28.12.2015, 16:45  [ТС]
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
#include <iostream>
#include <set>
#include <cstring>
 
struct str {
    char* p;
    str(void):p(NULL){}
    str(char* _p):p(_p){}
 
    bool operator < (const str& s) const {
        return (strcmp(p, s.p) < 0);
    }
};
 
int main(void){
    const int N = 64;
    char s1[N]  = "Lisp, Apl, Pascal, Algol, Forth, Prolog.";
    char s2[N]  = "Pascal, Prolog, Ada, Apl, Lisp, Actor.";
    char s3[N+N];
 
    std::set<str> ss;
 
    const char delim[] = " \t\n.,!?";
    for(char* i = strtok(s1, delim); i != NULL; i = strtok(NULL, delim))
        ss.insert(i);
 
    char* p = &s3[0];
    for(char* j = strtok(s2, delim); j != NULL; j = strtok(NULL, delim)){
        if(ss.find(j) != ss.end()){
            if(p != s3)
                *p++ = ' ';
            while(*j)
                *p++ = *j++;
        }
    }
    *p = '\0';
    ss.clear();
    std::cout << s3 << std::endl;
    return 0;
}
Пример работы кода[/QUOTE]
Цитата Сообщение от Геомеханик Посмотреть сообщение
Здесь у тебя логическая ошибка связанная с работой функции strtok, ибо строка при первом проходе будет поделена на null terminate \0, отсюда следует что в следующем цикле будет только первое слово.
А конкретно мой вариант... Можно его как-либо исправить?
0
0 / 0 / 0
Регистрация: 17.11.2022
Сообщений: 76
14.01.2023, 11:56
Подскажите пожалуйста, а как бы это решение выглядело в обычном си?
0
Заблокирован
14.01.2023, 15:41
Цитата Сообщение от Boiycha Посмотреть сообщение
в обычном си?
А есть не обычный Си ?

Цитата Сообщение от Boiycha Посмотреть сообщение
как бы это решение выглядело
Все так же, только на функциях. Принципиально ничего не меняется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.01.2023, 15:41
Помогаю со студенческими работами здесь

Вводятся две строки; составить третью строку, содержащую уникальные буквы
Вводятся две строки . Составить третью строку Б содержащую уникальные буквы. Буква считается уникальной, если она есть только в одной из...

Даны две строки С и Т, определите длину наибольшей строки, которая встречается в обеих
Даны две строки С и Т, определите длину наибольшей строки, которая встречается в обеих. Формат входных данных Первая строка входных...

Даны две строки s и t, определите длину наибольшей строки, которая встречается в обеих
Даны две троки s и t, определите длину наибольшей строки, которая встречается в обеих

Даны две строки s и t, определите длину наибольшей строки, которая встречается в обеих
Даны две строки s и t, определите длину наибольшей строки, которая встречается в обеих Формат входных данных Первая строка входных...

вам даны две строки s и t определите длину наибольшей строки которая встречается в обеих
вам даны две строки s и t определите длину наибольшей строки которая встречается в обеих


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru