- ベストアンサー
C++の問題で文字列クラスを作成したが、ゴミのような文字が表示される理由とは?
- C++の問題で、参考書にある「簡易的な文字列クラスStringを作成せよ」という問題を解いた。
- 実行結果を確認する際、文字列を連結するメソッドに問題があり、ゴミのような文字が表示されることに気づいた。
- ゴミのような文字が表示される原因は、文字列の先頭に必ずヌル文字を追加する処理がされていないためだと推測される。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
本題自体は #1 でも言われるように「strcpy と strcat の違いを理解しろ」ってことなんだけど.... ついでにコメント: ・引数が String & になっているのが多いけど, なぜ const String & にしないの? ・String::operator + の結果は String にすべきだと思う. そうじゃないと a+b+c で楽しいことがおきる. ・String::operator == がおかしい.
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
String::operator == の話だけですが, strcmp は「等しいとき」に 0 を返しま す. だから, 現状 String::operator == は等しいときに false を, 等しくない ときに true を返します.
- magicalpass
- ベストアンサー率58% (378/648)
> どうしてこのようなことが起こるか、どこでゴミが入ってしまうのか教えてほしいです。 > char *memory = new char[this->len + a.len + 1]; C++ではnewで配列領域を確保しただけでは初期化はされません。したがって最初からゴミが入っています。 > return strcat(strcat(memory, this->s), a); ゴミが入った領域にstrcatで文字列を追加してるのだから、先頭にゴミが入ります。 普通は以下のようにするでしょうね。 return strcat(strcpy(memory, this->s), a);
お礼
newで確保した配列は初期化されていないのですか・・ charの場合は先頭がNULLで初期化されているのだと思ってました。 だから、先頭のゴミの上から最初のをコピーして、次にそこに連結するんですね! わかりやすく教えていただいてありがとうございます
お礼
下の方の回答でstrcpyとstrcatの使い分けがわかりました。 ありがとうございます。 あぁ・・確かにconst参照にしたほうがいいですね! 何かまだconstをつける習慣、というんですか、constの発想が毎回はできないみたいです・・。 本当ですね・・・楽しいことがおきました(笑) char * で返していたらもう一回の連結のときは連結方法がわからない状況になるから、型名を返したほうがいいんですね うーん・・どこがおかしいのかよく分からないです・・。ごめんなさい。 int型からbool型に暗黙的に変換されているところですか? ここだったら、0以外はtrueになるかなぁと思ってこうしておきました おかしいところを指摘していただいてありがとうございました!