string型配列変数とSTLによる配列追加

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

string型配列変数とSTLによる配列追加

#1

投稿記事 by MoNoQLoREATOR » 13年前

プログラム実行途中でstring型配列変数の要素を増やしたいのですが、STLでは実現できそうにありません。

下記のプログラムではエラー終了することがわかりました。************


#include <string>
#include <vector>

vector<string> vector_string;

※省略してますWinMain(){

char str[] = "あいうえお";
※vector_string.push_back(str); はコンパイルエラーだったので下記のようにしました

※その1
vector_string.push_back(0);
vector_string[任意の番号]+=str;

その2
vector_string.resize(vector_string.size()+1);
vector_string[任意の番号]+=str;
※その1,その2 共にエラー終了
}

************************************


string型変数はSTLでは扱えないのでしょうか?

扱えないのなら、プログラム実行中にstring型配列変数に要素を追加する方法は他にありませんか?

ご教授よろしくおねがいします。

アバター
qwea
記事: 14
登録日時: 13年前

Re: string型配列変数とSTLによる配列追加

#2

投稿記事 by qwea » 13年前

vector_string.push_back(string(str));

ではだめでしょうか?

ゲスト

Re: string型配列変数とSTLによる配列追加

#3

投稿記事 by ゲスト » 13年前

#include <string>
#include <vector>
 
using namespace std;
 
vector<string> vector_string;
 
int main() {
    char str[] = "あいうえお";
    vector_string.push_back(str);
}
というコードを ideone で試してみましたが、普通に動きますね。
http://ideone.com/GrgOD

MoNoQLoREATOR

Re: string型配列変数とSTLによる配列追加

#4

投稿記事 by MoNoQLoREATOR » 13年前

vector_string.push_back(0);
はエラー終了の原因ではなく、次の
vector_string[任意の番号]+=str;
が原因でした。失礼しました。



質問しなおします。

実は、テキストファイルの文章の , から , までの文字列をstring型配列変数に順番に格納するプログラムを書こうとしています。

以下そのプログラム**********************


#include "DxLib.h"
#include <string>
#include <vector>
using namespace std;


FILE *filehandle;
vector<string> vector_string;
int str;
int number;




int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1) return(-1);
SetDrawScreen(DX_SCREEN_BACK);

※ファイルハンドル取得処理は省略


while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
str = getc(filehandle);
if(str!=EOF){
if(str==44){
※ , の文字コードが44です
number++;
vector_string.resize(number+1);
※vector_string.push_back(str);はコンパイルエラー
}else{
vector_string.at(number)+=str;
※"Abnormal program termination"というエラー発生
}
}else{
break;
}[/color]
}

fclose(filehandle);

DxLib_End();
return(0);
}


以上プログラム***********************


赤の部分を繰り返すことによって、ファイルの終末に達するまで、「 , がでるまで1文字ずつ同じ配列に格納。 , がでたらnumberを1増やして、以降は次の配列に格納するようにする」という処理を実現させようとしています。

vector_string.at(number)+=str;   の部分を

vector_string[number]+=str;     に変えると、

問題が発生したため、.exe を終了します。 ご不便をおかけして申し訳ありません。

というエラーがでます。

アバター
ookami
記事: 214
登録日時: 13年前
住所: 東京都

Re: string型配列変数とSTLによる配列追加

#5

投稿記事 by ookami » 13年前

エラーの原因はともかく、
一文字読むたびにProcessMessageを呼んでいるのは意図どおりなのでしょうか?

ゲスト

Re: string型配列変数とSTLによる配列追加

#6

投稿記事 by ゲスト » 13年前

はい意図どおりです。ホワイルループ処理をするときはプロセスメッセージ関数を呼ぶようにしています。

アバター
ookami
記事: 214
登録日時: 13年前
住所: 東京都

Re: string型配列変数とSTLによる配列追加

#7

投稿記事 by ookami » 13年前

そうなんですか。
まぁ省略されている部分もあるので、おいておきましょうかw


さて、
> vector_string.resize(number+1);※vector_string.push_back(str);はコンパイルエラー

とありますが、
vector<string> vector_string;
と定義されているので、
vector_string.push_back()
の引数はstring型でなければなりませんが、
strはint型なのでエラーになります。

次に、
> vector_string.at(number)+=str;※"Abnormal program termination"というエラー発生
の方は、
> vector_string.resize(number+1);
の前に実行されるケースでエラーになると思われます。

ゲスト

Re: string型配列変数とSTLによる配列追加

#8

投稿記事 by ゲスト » 13年前

ありがとうございます。

vector_string.push_back(str);

はダメ元でためしました。まさかその原因まで教えていただけるとは、なんて親切な^^; ちゃんとコンパイラーさんが教えてくれたので大丈夫ですよ。

”at関数は vector_string.resize(number+1); の後に実行されなければならない”
言われてみれば、たしかにそうですね。今回のプログラムでは、 .resize() が実行される前にat関数が使用される事がありえますね。
ということは、ここはat関数を使わずに [ ] で要素数を指定するようにすれば解決ですね。


さて、問題は
vector_string[任意の番号]+=str;
です。
vector<string> vector_string; と定義せず、
string vector_string; として、純粋なstring型変数であると定義したときは全く問題ありませんでした。
何故でしょう?
もしや、vector_string.resize();が実行される前に実行されたときに、vector_stringはまだ配列変数ではないので、
vector_string[任意の番号]+=str;
はアウトということなのでしょうか。

さて、どうやって確かめようか・・・。もしそれが原因だとしたら・・・プログラムの最初の方に.resize(1);を書けばよいのでしょうか?

ゲスト

Re: string型配列変数とSTLによる配列追加

#9

投稿記事 by ゲスト » 13年前

> ここはat関数を使わずに [ ] で要素数を指定するようにすれば解決ですね。

at関数と []オペレータは、要素数の指定という意味では同じですよ。
エラーチェックの仕様がちょっと違うだけです。
なので、このケースでは解決にならないと思います。


> string vector_string; として、純粋なstring型変数であると定義したときは全く問題ありませんでした。
> 何故でしょう?
> もしや、vector_string.resize();が実行される前に実行されたときに、vector_stringはまだ配列変数ではないので、
> vector_string[任意の番号]+=str;
> はアウトということなのでしょうか。
> さて、どうやって確かめようか・・・。もしそれが原因だとしたら・・・プログラムの最初の方に.resize(1);を書けばよいのでしょうか?

なんかカオスってきましたねw
どんな仕組みで読み込みたいか、
言葉で説明してみてもらえますか?

--
あと、ステップ実行はご存知ですか?(F10で実行したりF9でブレークポイントを仕掛けたり)
デバッグ効率がかなり変わると思います。

アバター
ookami
記事: 214
登録日時: 13年前
住所: 東京都

Re: string型配列変数とSTLによる配列追加

#10

投稿記事 by ookami » 13年前

追記

[]オペレータととat()関数について。

http://www.geocities.jp/ky_webid/cpp/library/001.html
> [] (中略) もし範囲外をアクセスしたら、実行時エラーによってプログラムが強制終了する可能性があります。
> at() というメンバ関数を使うと、[] と同じように要素をアクセスできます。 at() の場合、範囲外をアクセスすると out_of_range例外を送出します。

ということで、[]とat()は、強制終了か例外送出かの違いだけで、範囲外にアクセスできないことに変わりはありません。

あと、今の流れにはマッチしないかもしれませんが、
ifstreamを使う方法もあります。
ご参考まで。
http://ml.tietew.jp/cppll/cppll/article/8202

MoNoQLoREATOR

Re: string型配列変数とSTLによる配列追加

#11

投稿記事 by MoNoQLoREATOR » 13年前

解決しました


whileループに入る前に
vector_string.resize(1);
を書くと、予想通りエラーが出なくなりました。これで先へ進めます。ありがとうございました。

閉鎖

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