2016-11-30 12 views
0

文字配列を正しくスワップするためにstrcpyを使用することはできません。私はstrncpy、memcpyを使っていましたが、それでも正しい結果を得られませんでした。strcpyを使用しているときに 'char'から 'const char *'への無効な変換

これは私のプログラムの外観です。

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; 
    } 
} 

ここに問題がある場所。

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); 
} 
}; 

どのように動作させることができますか?

+2

'Denumire [i]'は 'char'です。あなたは '&Denumire [i]'が必要です。 –

+0

それは動作しません。コンパイラがクラッシュしています。 –

+0

私はコンパイラがクラッシュしたとは思わないが、今更新されたコードを投稿し、正確なエラーを返してください。 – pm100

答えて

1

charのC配列は単一の文字列であるため、最初のすべてのデータ型が間違っています。彼らはintの場合と同じであることwhould移動、その後

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

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

またはより良い:

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

ます場合は、より優れた単一の文字列オブジェクトのような役割を果たしstd::stringを使用しますCの型に制限されているので、50個の文字列を保持するためにcharの配列の配列を作成しなければなりません。

+0

ありがとう!私は1年半の間だけCでプログラミングしています。私はまだC++には新しいです。 –

1

charは1文字です。あなたは完全な文字列のように扱っているようです。できる場合は、char*の代わりにstd::stringを使用することが最も適切です。これらは正しく使用する方がはるかに簡単です。

また、すべての要素を1つのstruct Bookにグループ化することをお勧めします。そうすれば、すべてが一緒になり、既存のSTLソートアルゴリズムを使用することができます。これは高速になります。

#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); 
    } 
}; 
関連する問題