Сравнение строк и вывод одинаковых слов С++

Jeembo

Хочу чтобы пользователь вводил 2 строки, они сравнивались и выводились одинаковые слова с двух строк. Программирую не так много, знаю мало, помогите с детальным объяснением ошибок и исправлением, пожалуйста на данный момент код имеет такой вид:
#include <iostream>
#include <cstdlib>
#include <iomanip>
#define R 50
#define D 50
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"rus");
    
    char str1[R];
    char str2[D];
    char lenght1;
    char lenght2;
    int i,j,flag,flag2; 
    cout<<"Введите строку: ";
    gets(str1);
    lenght1=strlen(str1);
    strtok((flag?str1:NULL)," ");
    flag=0;
    cout<<"Введите строку для сравнения: ";
    gets(str2);
    lenght2=strlen(str2);
    strtok((flag2?str2:NULL)," ");
    flag2=0;
    for(i=0;i<lenght1;++i){
        for(j=0;j<lenght2;++j)
        {
            if(str1[i]==str2[j])
            { cout<<str1[i]<<endl;
            break;
            }
        }
    }       
    system("pause");
    return 0;
}
5 ответов

Jeembo

Для strtok() нужны циклы. И нужно сохранять указатели на начало слов в какие-то массивы.


Jeembo

Можете пожалуйста объяснить как это сделать? Я новичок в этом деле, мало чего знаю, поэтому и написал сюда)


Jeembo

#include <iostream>
#include <cstring>
#include <set>
 
struct sword {
    const char* p;
    sword(void):p(NULL){}
    sword(const char* s):p(s){}
 
    bool operator < (const sword& w) const {
        return (strcmp(p, w.p) < 0);
    }
};
 
void intersect(std::ostream& _out, char* s1, char* s2){
    const char delim[] = " \t\n,.!?;:";
    std::set<sword> sw;
 
    for(s1 = strtok(s1, delim); s1 != NULL; s1 = strtok(NULL, delim))
        sw.insert(sword(s1));
 
    std::set<sword>::iterator i;
    for(s2 = strtok(s2, delim); s2 != NULL; s2 = strtok(NULL, delim)){
        i = sw.find(sword(s2));
        if(i != sw.end()){
            _out << i->p << std::endl;
            sw.erase(i);
        }
    }
    sw.clear();
}
 
int main(void){
    char s1[64] = "Pascal, Algol, Forth, Apl, Ada, Ruby.";
    char s2[64] = "Forth, Ruby, Forth, Pascal, Python, Ada.";
    intersect(std::cout, s1, s2);
    return 0;
}


Jeembo

Я же попросил с объяснением, но суть не в этом, я изначально написал: "хочу чтобы ПОЛЬЗОВАТЕЛЬ ВВОДИЛ 2 строки", вы мне написали сложный для новичка код, не дописанный до конца и не выполненными условиями, спасибо!и мне нужна помощь разобраться, понять это всё, и исправить код, а не получить готовый шаблон, другого кода без объяснений


Jeembo

Вот так с вводом:
int main(void)
{
    char s1[64];
    char s2[64];
 
    std::cout << "Введите 1-ю строку: ";
    std::cin.getline(s1, 64);
    std::cout << "Введите 2-ю строку: ";
    std::cin.getline(s2, 64);
 
    intersect(std::cout, s1, s2);
    return 0;
}
Что там понимать? Он циклы и добавил.