Porównywanie liczb oddzielonych przecinkami w dwóch stringach

0

Witam

Mam problem z zadaniem:

Napisz program który przyjmuje dwa ciągi liczb naturalnych oddzielonych przecinkiem typu string. Porównaj ze sobą dwa ciągi i wypisz na ekran te liczby które się powtarzają w obu ciągach.

Tutaj przedstawiam moje wypociny. Otóż jestem dopiero początkujący wiec nie znam wszystkich komend itp wiec jeżeli macie jakiś pomysł na skrócenie tego kodu bądź "ulepszenie" czy nawet dorzucenie jakiś rad byłbym bardzo wdzięczny. Mam jeszcze problem, czy jest jakiś znak który oznacza koniec stringu ? W programie nie zczytuje mi ostatniej liczby gdyż nie ma tam przecinka i zamiast tego chciałbym wskazać koniec stringa.

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main(int argc, char* argv[])
{
    string a ("12,13,34,35,67,78");
    string b ("11,14,54,163,78,23,87,13,12");
    string c, z;
    int j, q, k=1, f=0, v=0, x=1;
    for(int i=0; i<a.length();i++)
    {
        if(ispunct(a[i]))
        {
            x++;
        }
    }

    for(int i=0; i<b.length();i++)
    {
        if(ispunct(b[i]))
        {
            k++;
        }
    }
    int *tab=new int[x];
    int *tab2=new int[k];
    c=a[0];
    z=b[0];

    for(int i=1;i<a.length();i++)
    {

        if(a[i]!=',')
        {
            c+=a[i];
        }
        else if(a[i]==',' || a[i]=='\0') //tutaj mam problem bo chce zeby if sie wykonal jesli napotka przecinek lub koniec stringu
        {
            istringstream m(c);
            m>>j;
            tab[f]=j;
            f++;
            c.clear();
            c=a[i+1];
            i++;
        }
    }
    c.clear();

    for(int i=1;i<b.length();i++)
    {

        if(b[i]!=',')
        {
            z+=b[i];
        }
        else if(b[i]==',')
        {
            istringstream g(z);
            g>>q;
            tab2[v]=q;
            v++;
            z.clear();
            z=b[i+1];
            i++;
        }
    }
    z.clear();

    for(int i=0;i<x;i++)
        for(int j=0;j<k;j++)
        {
            if(tab[i]==tab2[j])
                cout<<tab[i]<<", ";

        }

    system("PAUSE");
    return 0;
} 
0

używasz stringstream i string to czemu nie użyć vector?

int v;
vector<int> va,vb;
for(istringstream ss(a);ss>>v;ss.getchar()) va.push_back(v);
sort(va.begin(),va.end());
for(istringstream ss(b);ss>>v;ss.getchar()) vb.push_back(v);
sort(vb.begin(),vb.end());

dalej to już wiadomo.

0

Koniec wpisywania - Zabezpieczenie przed wpisywaniem liter zamiast ignorować inne znaki, po prostu uznaj je za zakończenie podawania liczb.

Co do porównywania zawartości, to jest raptem kilka linijek kodu, jeśli użyjesz std::set i std::set_intersection http://en.cppreference.com/w/cpp/algorithm/set_intersection

1

Co do problemu w kodzie. Usuń stamtąd else.

Skrócenie kodu (nie używam takich hardcore'owych rzeczy jak iteratory) - to każdy początkujący zrozumieć MUSI:

string liczba1, liczba2;

int i = 0;
int j = 0;
while( i < string1.length() ) 
{
   while( string1[i] != ',' && string1[j] != '\0' )
      liczba1 += string1[++i];

   ++j;  //omiń przecinek

   while( j < string2.length() )
   {
          while( string2[j] != ',' && string2[j] != '\0' )
             liczba2 += string2[++j];

          ++j;  //omiń przecinek

          if( liczba1 == liczba2 ) cout<<liczba1<<endl;

          liczba2.clear();
   }

   liczba1.clear();
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0