質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

18182閲覧

Vectorクラスの配列へ文字列を代入する方法が知りたいです。

Kenny009

総合スコア15

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/02/14 14:25

前提・実現したいこと

昨年末からネットや書籍でC++の勉強をしており、現在は動的配列の処理で困っています。
プログラミングビギナーです。
ネットや本で3日粘ってここまで来ましたが、動的配列に対して文字型や文字列の処理を扱っている例がなく、心が折れそうです。

目的としては名簿を作成したいです。
名簿への登録人数をコンストラクタで指定し、クラス関数で名前の入力、出力を実装したいです。

###発生している問題・エラーメッセージ
30行目
error: no type named ‘type’ in ‘struct std::enable_if<false, std::basic_ostream<char>&>’

51行目
error: no match for ‘operator=’ (operand types are ‘__gnu_cxx::__alloc_traits<std::allocator<std::vector<char> > >::value_type {aka std::vector<char>}’ and ‘const char [7]’)

該当のソースコード

1 #include<iostream>
2 #include<stdio.h>
3 #include<stdlib.h>
4 #include<vector>
5
6 using namespace std;
7
8 class StudentList
9 {
10 private:
11 int a;
12 public:
13 int num;
14 int b;
15 vector<vector<char> >student;
16 StudentList();
17 int input_name(int b);
18 int show_name(int c);
19 };
20
21 StudentList::StudentList()
22 {
23 cout << "登録する人数を指定してください" << endl;
24 cin >> num;
25 }
26
27 int StudentList::input_name(int b)
28 {
29 cout << b << "番目に登録する名前を入力して下さい" << endl;
30 cin >> student[b];
31 }
32
33 int StudentList::show_name(int c)
34 {
35 if(c < num)
36 {
37 cout << c << "番目の名前は" << student[c] << endl;
38 }
39 else
40 {
41 cout << "欠番" << endl;
42 }
43 }
44
45 int main(void)
46 {
47 StudentList list;
48 list.student.resize(10);
49 list.student[0].resize(15);
50
51 list.student[0] = "名前";
52
53 for(int i = 1;i<=list.num;i++)
54 {
55 list.student[i].resize(15);
56 list.input_name(i);
57 }
58
59 while(1)
60 {
61 cout << "番号を入力して下さい" << endl;
62 cout << list.b;
63 if(list.b > list.num || list.b < 1)
64 {
65 cout << "番号は1以上かつ" << list.num << "以下" <<endl;
66 break;
67 }
68 else
69 {
70 list.show_name(list.num);
71 }
72 }
73 return 0;
74 }

c++

試したこと

strcpy(student[0],"名前");

補足情報(FW/ツールのバージョンなど)

VirtualBox
Ubunts(64bit)
コンパイラのバージョン,7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2019/02/14 14:36 編集

vector<vector<char> >student; ではなくstd::vector<std::string> student; では、だめですか?・・・あと、Cのヘッダを使っているのはなぜ?・・・<string>をインクルードするように・・
guest

回答3

0

型を std::vectorstd::string にするのが簡潔で扱いやすいかと。

投稿2019/02/14 14:30

LouiS0616

総合スコア35668

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kenny009

2019/02/16 11:00

その通りですね。なんでかcharにこだわっていました。 ありがとうございます。
guest

0

すでに、多くの方から指摘されているとおり、std::string を使用した方がよろしいとは思いますが、あえてこのまま実行できるように変更してみました。
まだ、見直すべき点はありますが、とりあえず最低限の修正です。

C++

1#include<iostream> 2#include<stdio.h> 3#include<stdlib.h> 4#include<vector> 5 6using namespace std; 7 8class StudentList 9{ 10private: 11 int a; 12public: 13 int num; 14 int b; 15 vector<vector<char> >student; 16 StudentList(); 17 int input_name(int b); 18 int show_name(int c); 19}; 20 21StudentList::StudentList() 22{ 23 cout << "登録する人数を指定してください" << endl; 24 cin >> num; 25} 26 27int StudentList::input_name(int b) 28{ 29 cout << b << "番目に登録する名前を入力して下さい" << endl; 30 //cin >> student[b]; 31 cin >> &student[b][0]; //修正 32 33 return 0; //??? 34} 35 36int StudentList::show_name(int c) 37{ 38 if (c < num) 39 { 40 //cout << c << "番目の名前は" << student[c] << endl; 41 cout << c << "番目の名前は" << &student[c][0] << endl; 42 } 43 else 44 { 45 cout << "欠番" << endl; 46 } 47 48 return 0; //??? 49} 50 51int main(void) 52{ 53 StudentList list; 54 list.student.resize(10); 55 list.student[0].resize(15); 56 57 //list.student[0] = "名前"; 58 59 for (int i = 1; i <= list.num; i++) 60 { 61 list.student[i].resize(15); 62 list.input_name(i); 63 } 64 65 while (1) 66 { 67 cout << "番号を入力して下さい" << endl; 68 //cout << list.b; 69 cin >> list.b; //修正 70 if (list.b > list.num || list.b < 1) 71 { 72 cout << "番号は1以上かつ" << list.num << "以下" << endl; 73 break; 74 } 75 else 76 { 77 //list.show_name(list.num); 78 list.show_name(list.b); //修正 79 } 80 } 81 return 0; 82} 83

投稿2019/02/15 05:11

Bull

総合スコア986

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kenny009

2019/02/16 11:09

皆様のご指摘通りstringに直しました。 しかし、charでも出来るんですね。三日かけても自分は出来ませんでした。 charの配列の場合、直接アドレスを読み書きすれば良かったんですね。 考え方が勉強になりました。 ありがとうございます。
guest

0

ベストアンサー

ちょっと ここ(teratail)の使い方が違いますよ。

他の回答者や質問者の書き方を参考にしてください。


まず、気になったのは、必ず vector<char>のvectorでないといけませんか?

単に文字列を使うなら std::string が(まだ)いいです。

char* とするとアドレスが確保されるようです。コツがいるので、

C++

1std::vector<std::string> strs;

みたいにやったほうがわかりやすいですし、使いやすいです。

また、StudentListクラスにあるnum, b, student はなるべくprivateに。

参考: オブジェクト指向設計 getter, setterを使うなとはどういうことか

また、もしかして日本語を入力していませんか? 特に student を入力させるところ。

日本語は基本的に全角文字です。

半角英数字なら 配列だと 一要素分 で済む場合でも、全角だと基本的に 二要素は必要です。( バイト数によって変わるのかな? ここはわからんが。 )

なので、単純に考えると、

"あいうえお" でも日本語的に考えると5文字。でも半角英数字と比較した場合は、単純計算で 5×2=10 となり、10文字扱いになります。(厳密にはバイト数だけど。)

ケータイサイズのケース( ケータイでもいいし、たばこでもいい。 ) に ノートパソコンを入れようとしているのと同じこと。
「え? 同じ人工物でしょ?」みたいな。


[追記1]

ちなみに日本語みたいな全角で一文字とするような文字で構成するなら std::stringよりは std::wstring がいいみたいです。

定義は忘れましたが、std::stringはcharの動的確保系ですが、std::wstring は wchar_t の動的確保系です。

日本向けに発送して、かつ、個人開発なら std::wstringのほうが無難...かな?

ちょっとコツが要りますが、std::wstringだと文字化けしにくいです。( ただしOSの設定とかによるかもしれないが。 )

std::stringだと、"あ" と構成するだけでも、1バイト目と2バイト目をチェックしてやっとわかる。

だから 1バイト目にそれだけで完結するデータが来たらそれで終了してしまう可能性がある。

文字コードはよくわからないので、あくまでイメージですが、

"さすが" と "d*pqが" が同じ...

みたいな感じで文字化けする可能性が高いです。

std::wstring だと wchar_t なので "あ" で一つ。と見なせるらしいので、日本語を扱うならこっちのほうが楽かな?

また、私はあまりわかりませんが、std::stringはバグを持っているっぽいです。
(どっかの記事で見かけた...どこだったっけ?)

投稿2019/02/15 01:51

編集2019/02/17 01:42
BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kenny009

2019/02/16 11:05

>ちょっと ここ(teratail)の使い方が違いますよ。 ご指摘通り他の回答者や質問者の書き方を参考にさせていただきます。 >必ず vector<char>のvectorでないといけませんか? そんなことないです。 文字列=char型の配列使わなきゃ。。。という思考になってました。 >また、もしかして日本語を入力していませんか? 特に student を入力させるところ。 はい。日本語にも対応させたいと思っています。なので、ご指摘通りメモリサイズに気を付けます。 解答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問