char文字列への代入

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
C++わからへん

char文字列への代入

#1

投稿記事 by C++わからへん » 10ヶ月前

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

上記のプログラムを書いて実行したところ、エラーが発生しました。文字列の代入の仕方に問題があると思うのですが、どこをどう直せばいいのかわかりません。初歩的な質問だと思いますが、よろしくお願いします。

アバター
あたっしゅ
記事: 250
登録日時: 9年前
住所: 東京23区
連絡を取る:

Re: char文字列への代入

#2

投稿記事 by あたっしゅ » 10ヶ月前

>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)
手提鞄あたっしゅ、[MrAtassyu] http://ameblo.jp/mratassyu/
手提鞄屋魚有店(てさげかばんやうおありてん)
レスがついていないものを優先して、レスしています。時々、見当外れなレスをします。

かずま

Re: char文字列への代入

#3

投稿記事 by かずま » 9ヶ月前

フォーラム(掲示板)ルールに従って、コードタグを使用してください。
フォーラム掲示板ルール さんが書きました: d. 義務行為
"C言語何でも質問掲示板"でのみ適用される事項
・複数の回答者がいた場合、都合の良い、または自分の気が向いた回答者にだけ返信を書かず、回答をくれた人 全員に対して出来る限りの返信を書きましょう。
・回答者のコメントの中に複数質問があった場合、出来る限りその全てに答えるようにしましょう。
name[10] = *name_student; がなぜダメなのか理解していますか?

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';
と書くか、

コード:

	if (strlen(name_student) < 10) strcpy(name, name_student);
と書くべきでしょう。

char name[10]; の代わりに string name; と宣言すれば、
name = name_string; だけで済みます。
#include <string> が必要ですが。

それから、ob.get_name(); を呼び出すだけでは、正しい結果が
返ってきたかどうかわかりません。
cout << ob.get_name() << endl; などのコードで確認しましょう。

返信をお待ちしております。

返信

“C言語何でも質問掲示板” へ戻る