0

Can't use strcpy, to properly swap char array. I used strncpy, memcpy everything and still didn't get the right result.

This is how my program looks.

class Carte
{
protected:
    char Denumire[50];
    char Autor[50];
    char Editura[50];
    int AnPublicare[50];
public:
    void Citire(int n)
    {
        for(int i=0;i<n;i++)
        {
            cout<<"Denumire: "; cin>>Denumire[i]; cout<<endl;
            cout<<"Autor: "; cin>>Autor[i]; cout<<endl;
            cout<<"Editura: "; cin>>Editura[i]; cout<<endl;
            cout<<"An Publicare: "; cin>>AnPublicare[i]; cout<<endl;
        }
    }

    void Afisare(int n)
{
    for(int i=0;i<n;i++)
    {
        cout<<"Denumire: "<<Denumire[i]<<endl;
        cout<<"Autor: "<<Autor[i]<<endl;
        cout<<"Editura: "<<Editura[i]<<endl;
        cout<<"An Publicare: "<<AnPublicare[i]<<endl<<endl;
    }
}

This where the problem is located.

void Sortare(int n)
{
  int ok,aux;
  char *auxDen , *auxAt, *auxEd;
     do{
         ok=1;
         for(int i=0;i<n-1;i++)
            if(AnPublicare[i]>AnPublicare[i+1])
            {
                ok=0;
                aux=AnPublicare[i];
                AnPublicare[i]=AnPublicare[i+1];
                AnPublicare[i+1]=aux;

                strcpy(auxDen,Denumire[i]);
                strcpy(Denumire[i],Denumire[i+1]);
                strcpy(Denumire[i+1],auxDen);

                strcpy(auxAt,Autor[i]);
                strcpy(Autor[i],Autor[i+1]);
                strcpy(Autor[i+1],auxAt);

                strcpy(auxEd,Editura[i]);
                strcpy(Editura[i],Editura[i+1]);
                strcpy(Editura[i+1],auxEd);
            }
    }while(ok!=1);
}
};

How can make it work?

Lame Fanello
  • 545
  • 1
  • 6
  • 15

2 Answers2

1

In C array of char is a single string, so first of all your data types are wrong. You better use std::string which acts like a single string object:

class Carte
{
protected:
    std::string Denumire[50];
    std::string Autor[50];
    std::string Editura[50];
    int AnPublicare[50];

then moving them whould be the same as for int:

std::string tmp;
tmp = Denumire[i];
Denumire[i] = Denumire[i+1];
Denumire[i+1] = tmp;

or even better:

std::swap( Denumire[i], Denumire[i+1] );

if you are limited to C types you have to create array of arrays of char to keep 50 strings.

Slava
  • 43,454
  • 1
  • 47
  • 90
1

A char is just one character; you seem to be treating it like a full string. If you can, it is best to use std::string instead of char*, because they are much easier to use correctly.

Also, I would recommend you group all of your elements into one struct Book. That way everything is together, and you can use existing STL sort algorithms, which will be faster.

#include <string>
#include <vector>
#include <algorithm>

struct Book{
    std::string Denumire;
    std::string Autor;
    std::string Editura;
    int AnPublicare;
};

bool publisherLessThan(const Book& a, const Book& b) {
    return a.AnPublicare < b.AnPublicare;
}

class Carte
{
protected:
    std::vector<Book> books;
public:
    void Citire(int n)
    {
        books.clear();
        for(int i=0;i<n;i++)
        {
            Book book
            cout<<"Denumire: "; cin>>book.Denumire; cout<<endl;
            cout<<"Autor: "; cin>>book.Autor; cout<<endl;
            cout<<"Editura: "; cin>>book.Editura; cout<<endl;
            cout<<"An Publicare: "; cin>>book.AnPublicare; cout<<endl;
            books.push_back(book);
        }
    }

    void Afisare()
    {
        for(const Book& book : books)
        {
            cout<<"Denumire: "<<book.Denumire<<endl;
            cout<<"Autor: "<<book.Autor<<endl;
            cout<<"Editura: "<<book.Editura<<endl;
            cout<<"An Publicare: "<<book.AnPublicare<<endl<<endl;
        }
    }

    void Sortare() {
      std::sort(books.begin(), books.end(), publisherLessThan);
    }
};
Toby Speight
  • 27,591
  • 48
  • 66
  • 103
Joseph Ireland
  • 2,465
  • 13
  • 21