#include "stdafx.h"
#include <iostream>
using namespace std;
class student {
char name[10];
public:
char *get_name() { return name; }
void register_student(const char *name_student) { name[10] = *name_student; }
};
int main()
{
student ob;
ob.register_student("lebron");
ob.get_name();
return 0;
}
上記のプログラムを書いて実行したところ、エラーが発生しました。文字列の代入の仕方に問題があると思うのですが、どこをどう直せばいいのかわかりません。初歩的な質問だと思いますが、よろしくお願いします。
char文字列への代入
Re: char文字列への代入
>void register_student(const char *name_student) { name[10] = *name_student; }
C/C++ では、
name[10] = *name_student;
上記は、ダメです。
strcpy( name, name_student );
です。
https://ja.wikipedia.org/wiki/Strcpy
strcpy - Wikipedia(ja)
古い教科書を使ってますね。実は、char name[10]; 自体がダメです。string を使いましょう。
http://vivi.dyndns.org/tech/cpp/string.html
手を動かしてさくさく理解する C++ 文字列クラス std::string 入門 - ViVi(ja)
C/C++ では、
name[10] = *name_student;
上記は、ダメです。
strcpy( name, name_student );
です。
https://ja.wikipedia.org/wiki/Strcpy
strcpy - Wikipedia(ja)
古い教科書を使ってますね。実は、char name[10]; 自体がダメです。string を使いましょう。
http://vivi.dyndns.org/tech/cpp/string.html
手を動かしてさくさく理解する C++ 文字列クラス std::string 入門 - ViVi(ja)
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
Re: char文字列への代入
フォーラム(掲示板)ルールに従って、コードタグを使用してください。
char name[10]; と宣言すると、char 10個分の領域がメモリ中に確保され、
name[0]~name[9] のように使用します。
name[10] は確保した領域の範囲外なので、そこに何かを代入すると
他の変数や、関数の戻り番地などの重要な情報が壊れてしまいます。
「name[10] が配列全体を表す」と勘違いしていませんか?
name_student は「const char へのポインタ」で、
文字列 "lebron" の先頭の 1文字 'l' を指しています。
したがって、*name_student の値は 'l' です。
*name_student が、文字列"lebron"全体になると勘違いしていませんか?
やりたいことは、name[0]~name[6] の 7個所に
'l', 'e', 'b', 'r', 'o', 'n', '\0' の 7文字を入れたいということですね。
と書くか、
と書くべきでしょう。
char name[10]; の代わりに string name; と宣言すれば、
name = name_string; だけで済みます。
#include <string> が必要ですが。
それから、ob.get_name(); を呼び出すだけでは、正しい結果が
返ってきたかどうかわかりません。
cout << ob.get_name() << endl; などのコードで確認しましょう。
返信をお待ちしております。
name[10] = *name_student; がなぜダメなのか理解していますか?フォーラム掲示板ルール さんが書きました: d. 義務行為
"C言語何でも質問掲示板"でのみ適用される事項
・複数の回答者がいた場合、都合の良い、または自分の気が向いた回答者にだけ返信を書かず、回答をくれた人 全員に対して出来る限りの返信を書きましょう。
・回答者のコメントの中に複数質問があった場合、出来る限りその全てに答えるようにしましょう。
char name[10]; と宣言すると、char 10個分の領域がメモリ中に確保され、
name[0]~name[9] のように使用します。
name[10] は確保した領域の範囲外なので、そこに何かを代入すると
他の変数や、関数の戻り番地などの重要な情報が壊れてしまいます。
「name[10] が配列全体を表す」と勘違いしていませんか?
name_student は「const char へのポインタ」で、
文字列 "lebron" の先頭の 1文字 'l' を指しています。
したがって、*name_student の値は 'l' です。
*name_student が、文字列"lebron"全体になると勘違いしていませんか?
やりたいことは、name[0]~name[6] の 7個所に
'l', 'e', 'b', 'r', 'o', 'n', '\0' の 7文字を入れたいということですね。
int i;
for (i = 0; i < 9 && name_student[i] != '\0'; i++)
name[i] = name_student[i];
name[i] = '\0';
char name[10]; の代わりに string name; と宣言すれば、
name = name_string; だけで済みます。
#include <string> が必要ですが。
それから、ob.get_name(); を呼び出すだけでは、正しい結果が
返ってきたかどうかわかりません。
cout << ob.get_name() << endl; などのコードで確認しましょう。
返信をお待ちしております。