ページ 11

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

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

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

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

Posted: 2011年2月04日(金) 00:54
by softya(ソフト屋)

コード:

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

using namespace std;

int main()
{
	vector<string> vec; 

	vec.push_back("HFRHRFFFR");
	cout << vec[0] << endl;
    return 0;
}
って事?
解説するほどでも無いと思うので、分からないことがあったら聞いてください。

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

Posted: 2011年2月04日(金) 01:03
by h2so5

コード:

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

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

Posted: 2011年2月04日(金) 03:35
by kaka
ご回答有り難うございます。m(_ _)m

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

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

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

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

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

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

Posted: 2011年2月04日(金) 11:37
by softya(ソフト屋)
int main {}と言う戻り値がintの関数ですので、戻り値を返しています。
return 0;の0は正常なら0が大体のOSの仕様だからです。
MS-DOS時代は重要な意味があったんですけどWindows時代にはあまり使われません。

ただし、C99(Cの1999年規格)とC++ではmain関数に限り、そのmain関数の戻り値の型がintであればreturn 0;があったと見なされるって規格があるので、準拠しているコンパイラであれば省略してもエラーは出ません。

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

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

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

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

Posted: 2011年2月05日(土) 12:25
by softya(ソフト屋)
>二項演算子 '==' : 型 'std::basic_string<_Elem,_Traits,_Ax>' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。

エラーを起こしたソースコードを貼ってもらえますか?

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

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

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

Posted: 2011年2月06日(日) 00:00
by softya(ソフト屋)
>二項演算子 '==' : 型 'std::basic_string<_Elem,_Traits,_Ax>' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。

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

あと

コード:

void main(){
    return 0;
}
は関数の戻り値voidですので、returnで値を戻り値にしてはいけません。
void main(){
    return;
}
か
int main(){
    return 0;
}
どちらかにしてください。

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

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

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

Posted: 2011年2月07日(月) 00:14
by softya(ソフト屋)
それは本当に型が違うからです。
文字列と文字を混同しないでください。
"文字列"
'文字'
この2つは型が違います。

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

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

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

Posted: 2011年2月07日(月) 11:00
by softya(ソフト屋)
違いはですね。C++には型を調べるtypeidクラスがあるので、これで比べてみてください。

コード:

#include<iostream>
using namespace std;
 
void main(){
	cout << typeid("文字列").name() << endl;
	cout << typeid('文字').name() << endl;
}
"文字列"は文字配列ですね。
そして'文字'は数値なんです。
ちゃんとした参考書を読めば解説されていると思いますよ。

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

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

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

Posted: 2011年2月08日(火) 16:07
by maru
kaka さんが書きました:では、どのようにしたら、配列と文字を比較(array == '文字')できるのでしょうか?(><;)

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

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

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

Posted: 2011年2月08日(火) 20:10
by kaka
確かにそうですね。
しかし、上記のプログラムにおいて、文字でなく文字列にして実行した場合、文字列を入力し改行を押しても何も起こらなくなるのはなぜなのでしょうか?(?ω?)

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

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

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

Posted: 2011年2月10日(木) 12:21
by softya(ソフト屋)
具体的なコードを書いていただけると、こちらにも伝わると思います。
※ 前回の投稿は文字化け(WEB文字コードの混入)しているのでご注意下さい(必ず投稿前にプレビューして確認して下さい)。

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

Posted: 2011年2月12日(土) 07:45
by kaka
どうしても文字化けが直らないので文章にてもう一度説明させていただきます。

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

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

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

Posted: 2011年2月12日(土) 09:49
by softya(ソフト屋)
なぜ文字列から文字にしたいか分かりませんが一文字目と比較したいだけなら。
array == "H"
から
compare関数に変えるべきです。
http://www.cppll.jp/cppreference/cppstr ... ml#compare

こんな感じ。
array.compare(0,1,"H") == 0

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

Posted: 2011年2月12日(土) 19:58
by kaka
なぜ文字列から文字にしたいかというと、文字の場合でないと動いてくれなかったからです。

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

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

Posted: 2011年2月12日(土) 21:31
by softya(ソフト屋)
先頭文字で、一文字だけって意味です。

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

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

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

Posted: 2011年2月13日(日) 10:20
by softya(ソフト屋)
vectorの機能とstringの機能を混同していると思われます。

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

格納されている先頭文字が"H"か確認したいなら
array.compare(0,1,"H")
でうまくいくはずです。

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

Posted: 2011年2月13日(日) 14:55
by kaka
vector配列に格納されている文字列を先頭の0~配列末尾まで順次チェックするにはどうしたらよいですか?(?へ?;)

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

Posted: 2011年2月13日(日) 15:00
by softya(ソフト屋)
全文字列の1文字だけが一致するか調べるなら、

コード:

for( int j=0 ; j<array[i].length() ; j++ ) {
 if( array[i].compare(j,1,"H") == 0 ) {
  //一致したときの処理
 }
}
とするのが良いでしょうね。

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

Posted: 2011年2月13日(日) 15:09
by softya(ソフト屋)
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 ) {
   //一致したときの処理
  }
 }
}
となるでしょう。

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

Posted: 2011年2月19日(土) 19:49
by kaka
つまり、こんな感じですか?
非表示エリア
この非表示エリアを表示するには、登録し、ログインする必要があります。

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

Posted: 2011年2月20日(日) 10:32
by softya(ソフト屋)
自分で動作が合っているかは分かると思いますが、自分での評価はいかがですか?

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

Posted: 2011年2月25日(金) 07:56
by kaka
エンターを押しても改行されただけで、判定が行われませんでした。

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

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

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

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

Posted: 2011年2月27日(日) 20:01
by kaka
結果表示のところで、「(ある状態) (読んだ文字)→ (次の状態)」としたいのですが、「(ある状態) (入力した文字列)→ (次の状態)」 となってしまいました。

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

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

Posted: 2011年2月28日(月) 00:04
by softya(ソフト屋)
一行の文字列であればstringだけで十分です。
vectorも不要です。

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

Posted: 2011年3月08日(火) 23:08
by kaka
それは、最初から必要なかったということですか?(><;

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

Posted: 2011年3月08日(火) 23:55
by softya(ソフト屋)
最初の説明で一行しか入力しないと説明が無くvectorを使うという事だったので複数行の前提でここまで進めてきました。
vector自体複数のオブジェクトを配列化するものなので、C言語の文字列処理に使うcharの配列とは役目が全然違います。
と言う事でvectorの処理を外してstringの処理だけ残せばお望みのものになると思いますが。

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

Posted: 2011年3月11日(金) 19:46
by kaka
説明不足申し訳ありませんでした。
おかげさまで、なんとか完成しました。
駄文、長文で本当に迷惑をおかけしました。
丁寧に説明していただき本当にありがとうございました。^^