1

can anyone help me out with this code.. All i want to do is copy display the character arrays initialized in the main function am pretty new to cpp and i can't figure a way out

#include<iostream>
using namespace std;

class base1
{
public:
void setname(char *name);
void setpubl(char *publisher);
void setauth(char *author);
char getname();
char getpubl();
char getauth();
private:
char init_name[50], init_publ[50], init_auth[50];

};

void base1::setname(char *name)
{
int i=0;
while(init_name[i] != '\0')
{
init_name[i]=name[i];
i++;
}
}

void base1::setpubl(char *publisher)
{
int j=0;
while(init_publ[j] != '\0')
{
init_publ[j]=publisher[j];
j++;
}
}

void base1::setauth(char *author)
{
int k=0;
while(init_auth[k] != '\0')
{
init_auth[k]=author[k];
k++;
}

}

const char* base1::getname() const
{
return init_name;
}

const char* base1::getpubl() const
{
return init_publ;
}
const char* base1::getauth() const
{
return init_auth;
}
/*
base1::base1()
{
init_name[0]=0;
init_publ[0]=0;
init_auth[0]=0;
}*/

int main()
{
base1 hello;
char name[]="cpp";
char publisher[]="dreamworks";
char author[]="random";
hello.setname(name);
hello.setpubl(publisher);
hello.setauth(author);
cout<<hello.getname()<<endl;
cout<<hello.getpubl()<<endl;
cout<<hello.getauth()<<endl;
return 0;
}

when i try to compile it it gives me loads of errors. can some one help me out. i am using g++

errors:

copychar.cpp:49:13: error: prototype for ‘const char* base1::getname() const’ does not match any in class ‘base1’</p>

copychar.cpp:10:6: error: candidate is: char base1::getname()

copychar.cpp:54:13: error: prototype for ‘const char* base1::getpubl() const’ does not match any in class ‘base1’</p>

copychar.cpp:11:6: error: candidate is: char base1::getpubl()

copychar.cpp:58:13: error: prototype for ‘const char* base1::getauth() const’ does not match any in class ‘base1’</p>

copychar.cpp:12:6: error: candidate is: char base1::getauth()

when i am using the following code, only the first character of each string is getting displayed

#include<iostream>
using namespace std;

class base1
{
public:
void setname(char *name);
void setpubl(char *publisher);
void setauth(char *author);
char getname();
char getpubl();
char getauth();
private:
char init_name[50], init_publ[50], init_auth[50];

};

void base1::setname(char *name)
{
int i=0;
while(name[i] != '\0')
{
init_name[i]=name[i];
i++;
}
}

void base1::setpubl(char *publisher)
{
int j=0;
while(publisher[j] != '\0')
{
init_publ[j]=publisher[j];
j++;
}
}

void base1::setauth(char *author)
{
int k=0;
while(author[k] != '\0')
{
init_auth[k]=author[k];
k++;
}

}

char base1::getname()
{
return *init_name;
}

char base1::getpubl()
{
return *init_publ;
}
char base1::getauth()
{
return *init_auth;
}
/*
base1::base1()
{
init_name[0]=0;
init_publ[0]=0;
init_auth[0]=0;
}*/

int main()
{
base1 hello;
char name[]="cpp";
char publisher[]="dreamworks";
char author[]="random";
hello.setname(name);
hello.setpubl(publisher);
hello.setauth(author);
cout<<hello.getname()<<endl;
cout<<hello.getpubl()<<endl;
cout<<hello.getauth()<<endl;
return 0;
}
4

6 に答える 6

1
  • コンパイルエラーを1つずつ修正します
    • すべてのエラーを注意深く読んでください
    • 理解できない場合は、google/compilerのドキュメントを確認してください
    • まだ理解していません-それからこの非常にエラーを求めてください-あなたの場合それはどういう意味ですか
  • コードの単体テスト
  • プログラムが単体テストに合格しない(そして合格しない)場合は、コードをデバッグし、論理エラーを1つずつ修正します。

何かを書く必要があるたびに、これらの手順を実行してください。これはプログラミングスキルを向上させるための最良の方法です。他の人からの良いアドバイスや良い講義だけでは不十分です。

私はあなたにいくつかのヒントを与えることができます-しかしそれはそれほど明白ではないバグのために、将来のために役立ちますか?

ヒント:char文字列はで終了する必要があり'\0'ます。コピー後、文字列にはこの最後の文字が含まれていますか?

于 2012-10-18T20:50:14.863 に答える
1

関数のプロトタイプがgetter一致しません。ゲッターを次のように宣言しました..

char getname();

そして、あなたはそれをこのように実装します。

const char* base1::getauth() const

このように、プロトタイプを同じにします。

const char* getauth() const ;

そしてこのように実装します。

const char* base1::getauth() const
{
  //code here
}

同様に、すべてのgetter機能について。

于 2012-10-18T20:48:25.737 に答える
1

あなたのループは間違っています。

void base1::setpubl(char *publisher)
{
    int j=0;
    while(init_publ[j] != '\0')
    {
        init_publ[j]=publisher[j];
        j++;
    }
}

しかし

void base1::setpubl(char *publisher)
{
    int j=0;
    while(publisher[j] != '\0')
    {
        init_publ[j]=publisher[j];
        j++;
    }
    init_publ[j] = '\0'; // ensure destination string is null terminated
}

ループは、publisher文字列の末尾ではなく、関数に渡す文字列の末尾をチェックする必要がありinit_publます。その文字列にまだ値を与えていないので、これはあまり意味がありません。

他のループも同様です。

こちらもご覧ください

char getname();

この

const char* base1::getname() const

違いを見ます?最初に getname がであるcharと言い、次にconst char*and であると言いますconst。一貫性を保つ必要があります。2 番目は正しいです。置き換えます

char getname();

const char* getname() const;

getauth と getpubl と同じです。

于 2012-10-18T20:41:39.667 に答える
0
  • パラメータを取る setXXX 関数char *は、おそらくconst char*代わりに取る必要があります。
void setname(const char *name);
  • getXXX 関数はconst修飾子がないと宣言されていますが、定義はconst.
  • getXXX 関数は を返すように宣言されてcharいますが、定義は を返していconst char*ます。
const char* getname() const;
  • setXXX 関数は、ソースではなく宛先で null ターミネータをチェックしているため、文字がまったくコピーされません。
  • setXXX 関数は、おそらくループではなく for ループを使用する必要がありwhileます
  • バッファ オーバーラン チェックはまったく行いません。
void base1::setname(const char *name) 
{
  int i=0;
  for( ; name[i]!='\0' && i<49; ++i)
    init_name[i]=name[i];
  init_name[i] = '\0';  
}
  • クラスにコンストラクターがないため、メンバーがランダムに初期化される可能性があります
base1::base1()
:init_name(), init_publ(), init_auth()
{}
于 2012-10-18T20:42:28.097 に答える
-1

文字列関数を使用します。それが目的です(これが宿題である場合を除き、その場合はSOがここにあるものではありません)

ただし、主な問題は、データをクラス配列にコピーするときに、宛先配列がnullになると停止することです。ほとんどのC ++環境では、配列を宣言してもnullで初期化されません。ほとんどの場合、必要ありません。実際のデータで埋める配列を空白にするだけでパフォーマンスが低下します。

したがって、代わりに入力がヌル文字になるまで、または宛先配列がいっぱいになるまでコピーします。

于 2012-10-18T20:42:39.113 に答える
-1

引数に対して while を実行する必要があります:

void base1::setpubl(char *publisher)
{
     int j=0;
     while(publisher[j] != '\0')
     //...

すべてのメソッドで同じです

于 2012-10-18T20:42:13.007 に答える