2016-11-30 3 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

C의 char 배열은 단일 문자열이므로 첫 번째 모든 데이터 형식이 잘못되었습니다. 그들이 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은 하나의 문자입니다. 당신은 전체 문자열처럼 그것을 치료하는 것 같습니다. 가능한 경우 올바르게 사용하는 것이 훨씬 쉽기 때문에 char* 대신 std::string을 사용하는 것이 가장 좋습니다.

또한 모든 요소를 ​​하나의 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); 
    } 
};