プログラム実行途中で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型配列変数に要素を追加する方法は他にありませんか?
ご教授よろしくおねがいします。
string型配列変数とSTLによる配列追加
Re: string型配列変数とSTLによる配列追加
vector_string.push_back(string(str));
ではだめでしょうか?
ではだめでしょうか?
Re: string型配列変数とSTLによる配列追加
#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
Re: string型配列変数とSTLによる配列追加
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 を終了します。 ご不便をおかけして申し訳ありません。
というエラーがでます。
はエラー終了の原因ではなく、次の
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 を終了します。 ご不便をおかけして申し訳ありません。
というエラーがでます。
Re: string型配列変数とSTLによる配列追加
エラーの原因はともかく、
一文字読むたびにProcessMessageを呼んでいるのは意図どおりなのでしょうか?
一文字読むたびにProcessMessageを呼んでいるのは意図どおりなのでしょうか?
Re: string型配列変数とSTLによる配列追加
そうなんですか。
まぁ省略されている部分もあるので、おいておきましょうか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);
の前に実行されるケースでエラーになると思われます。
まぁ省略されている部分もあるので、おいておきましょうか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による配列追加
ありがとうございます。
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);を書けばよいのでしょうか?
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による配列追加
> ここはat関数を使わずに [ ] で要素数を指定するようにすれば解決ですね。
at関数と []オペレータは、要素数の指定という意味では同じですよ。
エラーチェックの仕様がちょっと違うだけです。
なので、このケースでは解決にならないと思います。
> string vector_string; として、純粋なstring型変数であると定義したときは全く問題ありませんでした。
> 何故でしょう?
> もしや、vector_string.resize();が実行される前に実行されたときに、vector_stringはまだ配列変数ではないので、
> vector_string[任意の番号]+=str;
> はアウトということなのでしょうか。
> さて、どうやって確かめようか・・・。もしそれが原因だとしたら・・・プログラムの最初の方に.resize(1);を書けばよいのでしょうか?
なんかカオスってきましたねw
どんな仕組みで読み込みたいか、
言葉で説明してみてもらえますか?
--
あと、ステップ実行はご存知ですか?(F10で実行したりF9でブレークポイントを仕掛けたり)
デバッグ効率がかなり変わると思います。
at関数と []オペレータは、要素数の指定という意味では同じですよ。
エラーチェックの仕様がちょっと違うだけです。
なので、このケースでは解決にならないと思います。
> string vector_string; として、純粋なstring型変数であると定義したときは全く問題ありませんでした。
> 何故でしょう?
> もしや、vector_string.resize();が実行される前に実行されたときに、vector_stringはまだ配列変数ではないので、
> vector_string[任意の番号]+=str;
> はアウトということなのでしょうか。
> さて、どうやって確かめようか・・・。もしそれが原因だとしたら・・・プログラムの最初の方に.resize(1);を書けばよいのでしょうか?
なんかカオスってきましたねw
どんな仕組みで読み込みたいか、
言葉で説明してみてもらえますか?
--
あと、ステップ実行はご存知ですか?(F10で実行したりF9でブレークポイントを仕掛けたり)
デバッグ効率がかなり変わると思います。
Re: string型配列変数とSTLによる配列追加
追記
[]オペレータとと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
[]オペレータとと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
Re: string型配列変数とSTLによる配列追加
解決しました
whileループに入る前に
vector_string.resize(1);
を書くと、予想通りエラーが出なくなりました。これで先へ進めます。ありがとうございました。
whileループに入る前に
vector_string.resize(1);
を書くと、予想通りエラーが出なくなりました。これで先へ進めます。ありがとうございました。