文字入力と配列についてです。(C++)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kaka
記事: 17
登録日時: 13年前

文字入力と配列についてです。(C++)

#1

投稿記事 by kaka » 13年前

文字入力で任意の長さの複数の文字列(例)"HFRHRFFFR"をベクター配列に入れるにはどのようにしたらいいですか?
できれば、コード付きで解説していただけると本当に有り難いです。
どなたかご回答お願いします。m(_ _)m

使用ソフト:VS2008
OS:vista
経験:始めたばかりです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 文字入力と配列についてです。(C++)

#2

投稿記事 by softya(ソフト屋) » 13年前

コード:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
	vector<string> vec; 

	vec.push_back("HFRHRFFFR");
	cout << vec[0] << endl;
    return 0;
}
って事?
解説するほどでも無いと思うので、分からないことがあったら聞いてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 文字入力と配列についてです。(C++)

#3

投稿記事 by h2so5 » 13年前

コード:

#include<vector>
#include<string>
#include<iostream>

using namespace std;

int main(){
	vector<string> ary;
	string str;
	
	while(cin >> str){			//入力した文字列をstrに代入
		ary.push_back( str );		//配列に追加
	}
	
	for(int i = 0; i < ary.size(); i++ ){
		cout << ary[i] << endl;		//中身を出力
	}
	return 0;
}

kaka
記事: 17
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#4

投稿記事 by kaka » 13年前

ご回答有り難うございます。m(_ _)m

入力は固定ではなく、任意ということを伝えたかったので「h2so5」さんのような感じです。
うまく伝えきれず申し訳ないです。

ですが、最後の方の「return 0」というのが、なぜ書かれているのかわかりません。
お手数ですが、解説お願いできませんか?

駄文、長文すみません。。。

non
記事: 1097
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#5

投稿記事 by non » 13年前

一言でいえば仕様だから。
呼び出したOSに対し、値を返すことが仕様で決められています。Windowsの場合は値が返ってきても何も利用はしていませんが、一般に正常終了の時は 0を返すと決められています。異常終了なら1を返します。
non

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 文字入力と配列についてです。(C++)

#6

投稿記事 by softya(ソフト屋) » 13年前

int main {}と言う戻り値がintの関数ですので、戻り値を返しています。
return 0;の0は正常なら0が大体のOSの仕様だからです。
MS-DOS時代は重要な意味があったんですけどWindows時代にはあまり使われません。

ただし、C99(Cの1999年規格)とC++ではmain関数に限り、そのmain関数の戻り値の型がintであればreturn 0;があったと見なされるって規格があるので、準拠しているコンパイラであれば省略してもエラーは出ません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kaka
記事: 17
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#7

投稿記事 by kaka » 13年前

仕様でしたか。
有り難うございます。
訊いてばかりで申し訳ないのですが、以下のエラーにおける「オペランド」といものが参考書などを見てもイマイチピンと来ないので、これの解説もしていただけると有り難いです。m(_ _)m

二項演算子 '==' : 型 'std::basic_string<_Elem,_Traits,_Ax>' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 文字入力と配列についてです。(C++)

#8

投稿記事 by softya(ソフト屋) » 13年前

>二項演算子 '==' : 型 'std::basic_string<_Elem,_Traits,_Ax>' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。

エラーを起こしたソースコードを貼ってもらえますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kaka
記事: 17
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#9

投稿記事 by kaka » 13年前

こんな感じですが、エラーが出たときは、 if文の条件(&& array == )の右辺が「ダブル」クォーテーションでなく「シングル」クォーテーションでした。
非表示エリア
この非表示エリアを表示するには、登録し、ログインする必要があります。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 文字入力と配列についてです。(C++)

#10

投稿記事 by softya(ソフト屋) » 13年前

>二項演算子 '==' : 型 'std::basic_string<_Elem,_Traits,_Ax>' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。

このエラーが出ないみたいです。

あと

コード:

void main(){
    return 0;
}
は関数の戻り値voidですので、returnで値を戻り値にしてはいけません。
void main(){
    return;
}
か
int main(){
    return 0;
}
どちらかにしてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kaka
記事: 17
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#11

投稿記事 by kaka » 13年前

if(pos == "q0" && array == 'H')のようにすると、エラーがでますが、ここでこう書くと右辺が文字化けしてしまうのでダブルクオーテーションにしてました。m(_ _;)m
非表示エリア
この非表示エリアを表示するには、登録し、ログインする必要があります。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 文字入力と配列についてです。(C++)

#12

投稿記事 by softya(ソフト屋) » 13年前

それは本当に型が違うからです。
文字列と文字を混同しないでください。
"文字列"
'文字'
この2つは型が違います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kaka
記事: 17
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#13

投稿記事 by kaka » 13年前

そのあたりの型の違いについてかなり怪しいので、エラーが出たということですね。
参考書を見てもさらっとしか書いてなかったので、気にしてませんでした。
よろしければ、解説をお願いしてもよろしいでしょうか?m(_ _ ;)m

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 文字入力と配列についてです。(C++)

#14

投稿記事 by softya(ソフト屋) » 13年前

違いはですね。C++には型を調べるtypeidクラスがあるので、これで比べてみてください。

コード:

#include<iostream>
using namespace std;
 
void main(){
	cout << typeid("文字列").name() << endl;
	cout << typeid('文字').name() << endl;
}
"文字列"は文字配列ですね。
そして'文字'は数値なんです。
ちゃんとした参考書を読めば解説されていると思いますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kaka
記事: 17
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#15

投稿記事 by kaka » 13年前

提示してくださったコードを実行してみた結果、確かにcharとintでデータ型が異なりました。
参考書を見直したところ、確かにちょっとだけですが書いてありました。
では、どのようにしたら、配列と文字を比較(array == '文字')できるのでしょうか?(><;)

maru
記事: 150
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#16

投稿記事 by maru » 13年前

kaka さんが書きました:では、どのようにしたら、配列と文字を比較(array == '文字')できるのでしょうか?(><;)

正確には配列の要素と文字の比較ですね。

この配列の要素は文字列ですが、なぜ、文字列と文字を比較しようとしているのでしょうか?
概念の違うものなので比較しようが有りません。(例えとしては少しおかしいかも知れませんが、身長と体重と比べているようなものです。)
"A"と'A'は同じように見えるかも知れませんが異なるものです。
kakaさんは、まず、この違いを認識することが必要でしょう。

kaka
記事: 17
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#17

投稿記事 by kaka » 13年前

確かにそうですね。
しかし、上記のプログラムにおいて、文字でなく文字列にして実行した場合、文字列を入力し改行を押しても何も起こらなくなるのはなぜなのでしょうか?(?ω?)

maru
記事: 150
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#18

投稿記事 by maru » 13年前

kaka さんが書きました:上記のプログラムにおいて、文字でなく文字列にして実行した場合、文字列を入力し改行を押しても何も起こらなくなるのはなぜなのでしょうか?(?ω?)
申し訳有りません。なにを言っているのかさっぱり分かりません。
まず、上記のプログラムとはどれのことでしょうか?
「文字でなく文字列にして実行」とはどういうことでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 文字入力と配列についてです。(C++)

#19

投稿記事 by softya(ソフト屋) » 13年前

具体的なコードを書いていただけると、こちらにも伝わると思います。
※ 前回の投稿は文字化け(WEB文字コードの混入)しているのでご注意下さい(必ず投稿前にプレビューして確認して下さい)。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kaka
記事: 17
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#20

投稿記事 by kaka » 13年前

どうしても文字化けが直らないので文章にてもう一度説明させていただきます。

No.9のコードからNo.9のコード中のif文の条件式であるarrayの右辺をそれぞれ「” ”」から「’ ’」に書き換えた場合

という意味でした。
下手な説明で申し訳ないです。(;ω;)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 文字入力と配列についてです。(C++)

#21

投稿記事 by softya(ソフト屋) » 13年前

なぜ文字列から文字にしたいか分かりませんが一文字目と比較したいだけなら。
array == "H"
から
compare関数に変えるべきです。
http://www.cppll.jp/cppreference/cppstr ... ml#compare

こんな感じ。
array.compare(0,1,"H") == 0
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kaka
記事: 17
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#22

投稿記事 by kaka » 13年前

なぜ文字列から文字にしたいかというと、文字の場合でないと動いてくれなかったからです。

array.compare(0,1,"H") == 0 の括弧内の0と1のところがどういうことを表しているのかよくわからないです(@@;)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 文字入力と配列についてです。(C++)

#23

投稿記事 by softya(ソフト屋) » 13年前

先頭文字で、一文字だけって意味です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kaka
記事: 17
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#24

投稿記事 by kaka » 13年前

ありがとうございます。
とりあえず、No.9のコードを以下のように書き換えてみたのですが、うまく動いてくれませんでした。
どこを間違えているのでしょうか?
また、どう書き換えればいいのでしょうか?
非表示エリア
この非表示エリアを表示するには、登録し、ログインする必要があります。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 文字入力と配列についてです。(C++)

#25

投稿記事 by softya(ソフト屋) » 13年前

vectorの機能とstringの機能を混同していると思われます。

array.compare(i,1,"H")
これは言うなれば
char str_array[10][10];
の配列でstr_array == 'H' とチェックしているに等しいです。

格納されている先頭文字が"H"か確認したいなら
array.compare(0,1,"H")
でうまくいくはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kaka
記事: 17
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#26

投稿記事 by kaka » 13年前

vector配列に格納されている文字列を先頭の0~配列末尾まで順次チェックするにはどうしたらよいですか?(?へ?;)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 文字入力と配列についてです。(C++)

#27

投稿記事 by softya(ソフト屋) » 13年前

全文字列の1文字だけが一致するか調べるなら、

コード:

for( int j=0 ; j<array[i].length() ; j++ ) {
 if( array[i].compare(j,1,"H") == 0 ) {
  //一致したときの処理
 }
}
とするのが良いでしょうね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 文字入力と配列についてです。(C++)

#28

投稿記事 by softya(ソフト屋) » 13年前

vector配列全体で調べるなら

コード:

for(unsigned int i = 0;i < array.size();i++){
 for( unsigned int j=0 ; j<array[i].length() ; j++ ) {
  if( array[i].compare(j,1,"H") == 0 ) {
   //一致したときの処理
  }
 }
}
となるでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kaka
記事: 17
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#29

投稿記事 by kaka » 13年前

つまり、こんな感じですか?
非表示エリア
この非表示エリアを表示するには、登録し、ログインする必要があります。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 文字入力と配列についてです。(C++)

#30

投稿記事 by softya(ソフト屋) » 13年前

自分で動作が合っているかは分かると思いますが、自分での評価はいかがですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kaka
記事: 17
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#31

投稿記事 by kaka » 13年前

エンターを押しても改行されただけで、判定が行われませんでした。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 文字入力と配列についてです。(C++)

#32

投稿記事 by h2so5 » 13年前

kaka さんが書きました:文字入力で任意の長さの複数の文字列(例)"HFRHRFFFR"をベクター配列に入れるにはどのようにしたらいいですか?
「複数の文字列」を入力するためのコードなので、エンターを押せば当然次の文字列の入力待ち状態になります。
入力待ち状態を終了するには、Ctrl+Zを押した後、エンターキーを押します。

あと、このプログラムで「複数の文字列」を入力させる意味ってないと思うんですが。
1行だけの入力では駄目なんでしょうか?

kaka
記事: 17
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#33

投稿記事 by kaka » 13年前

結果表示のところで、「(ある状態) (読んだ文字)→ (次の状態)」としたいのですが、「(ある状態) (入力した文字列)→ (次の状態)」 となってしまいました。

また、複数の文字列の入力ではなく、1行だけの文字列としたかったです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 文字入力と配列についてです。(C++)

#34

投稿記事 by softya(ソフト屋) » 13年前

一行の文字列であればstringだけで十分です。
vectorも不要です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kaka
記事: 17
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#35

投稿記事 by kaka » 13年前

それは、最初から必要なかったということですか?(><;

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 文字入力と配列についてです。(C++)

#36

投稿記事 by softya(ソフト屋) » 13年前

最初の説明で一行しか入力しないと説明が無くvectorを使うという事だったので複数行の前提でここまで進めてきました。
vector自体複数のオブジェクトを配列化するものなので、C言語の文字列処理に使うcharの配列とは役目が全然違います。
と言う事でvectorの処理を外してstringの処理だけ残せばお望みのものになると思いますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kaka
記事: 17
登録日時: 13年前

Re: 文字入力と配列についてです。(C++)

#37

投稿記事 by kaka » 13年前

説明不足申し訳ありませんでした。
おかげさまで、なんとか完成しました。
駄文、長文で本当に迷惑をおかけしました。
丁寧に説明していただき本当にありがとうございました。^^

閉鎖

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