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

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

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

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

Q&A

解決済

3回答

2298閲覧

C++でint型の変数に入っている整数をstring型の文字列に変えたい

saguaro

総合スコア9

C++

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

0グッド

0クリップ

投稿2018/08/01 12:27

C++でint型の変数に入っている整数をstring型の文字列に変えたい

C++でAtcoder Beginner Contest 075のB問題であるMinesweeperを解いています。
その回答をする上でint型の整数をstring型の文字列に変換してもう一度処理して出力したいのですが、実際に文字列を入力してみるとエラーに阻まれます。

発生している問題・エラーメッセージ

terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::at __n(which is 5) >=this->size() (which is 1)

該当のソースコード

// Minesweeper #include <bits/stdc++.h> using namespace std; int main () { int L,H,l1,l2,l3,l1c,l2c,l3c; cin >> L >> H; l1 = 0; l2 = 0; l3 = 0; l1c = 0; l2c = 0; l3c = 0; int keta,Lche; keta = 0; Lche = L; while ( Lche>0 ) { Lche /= 10; keta ++; } while ( H>0 ) { l3 = 0; string str1; cin >> str1; for ( int i=0; i<L ; i++ ) { int ri,num; ri = 1; if ( str1.at(i)!='.' ) { num = 1; } else { num = 0; } l3c += num*ri; } int d=1; for ( int j=0; j<keta-1 ; j++) { d *= 10; } l3 = l3c; l3c = l3c + l3c/10 + l3c*10 - ((l3c*10)/(d*10))*(d*10); l2c = l2 + l2/10 + l2*10 - ((l2*10)/(d*10))*(d*10); l1c = l1 + l1/10 + l1*10 - ((l1*10)/(d*10))*(d*10); l2c += l1c + l3c; string line = to_string(l2c); for ( int k=0; k<L ; k++ ) { if ( str1.at(k)=='.' ) { cout << line.at(k); } else { cout << str1.at(k); } } cout << endl; l1 = l2; l2 = l3; H--; } return 0; }

試したこと

無いものをもらってこようとしてエラーを起こしていたのかと予想して文字列の長さを確認してみましたがどうもうまくいきません。

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

MinGWを使っています、Windows7です。

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

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

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

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

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

guest

回答3

0

ベストアンサー

最初の入力はH(高さ)とW(幅)の順であり、長さWの文字列がH個与えられる。しかしcin >> L >> H;と書いているため、LにH(高さ、文字列の個数)が入り、HにW(幅、文字列の長さ)が入る。for ( int k=0; k<L ; k++ )のループは最大でL-1まで回るがL文字列の個数であるるが、str1の長さはHしかないため、str1.at(k)が範囲を超えてしまう場合がある。その場合はout_of_rangeの例外が発生し、プログラムは停止する。

投稿2018/08/01 14:28

raccy

総合スコア21733

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

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

saguaro

2018/08/01 14:44

!!!!! ......非常に初歩的なミスを犯していました、御回答ありがとうございます。そして申し訳ありません。 とてもよく理解できました
saguaro

2018/08/01 14:57

P.S. 的確に言っていただいたので貴方をベストアンサーにさせていただきます、このことは頭に刻みつけておきます。
guest

0

たぶんstr1.at()がout_of_rangeを発生しているのだと思いますが、デバッガで追いかけられませんか?
また、整数をstringにしているようですがなぜ小数点'.'が出てくるのか??
・・・申し訳ないですが、LやHなど意味不明(私には)変数名なので、見る気が起きません。
[追記]
とりあえず動かしてみましたが、ヒントになりますか?

txt

1usr~/test/cpp % ./tcp 25 35 412345 512345 62 7terminate called after throwing an instance of 'std::out_of_range' 8 what(): basic_string::at: __n (which is 1) >= this->size() (which is 1) 9Abort (core dumped) 10usr~/test/cpp % ./tcp 115 125 13123.45 14terminate called after throwing an instance of 'std::out_of_range' 15 what(): basic_string::at: __n (which is 3) >= this->size() (which is 1) 16123Abort (core dumped) 17usr~/test/cpp %

[intの桁指定?]

c++

1usr~/test/cpp % cat tcp.cpp 2// 3#include <iostream> 4using namespace std; 5// 6class Int{ 7 int val; 8 int siz; 9 int col[11]; 10public: 11 Int(int v):val(v),siz(0){ 12 int inx=0; 13 do{ 14 col[inx++]= v%10; 15 }while(v/=10); 16 siz= inx-1; 17 } 18 19 int operator[](int p)const{ return col[siz-p]; } 20}; 21 22int main() 23{ 24 int v= 123456; 25 // 26 Int s(v); 27 // 28 cout << s[4] << " " << s[2] << endl; 29 30 return 0; 31} 32 33usr~/test/cpp % ./a.out 345 3 35usr~/test/cpp %

投稿2018/08/01 13:51

編集2018/08/02 21:31
cateye

総合スコア6851

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

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

saguaro

2018/08/01 14:52

貴方の御回答の上に回答していただいた方に私の初歩的なミスをポイントアウトしていただいたので解決は致しました、お騒がせして申し訳ありません。 小数点ではなく単にドットを表しています。 LはLenghを、HはHeightを自分なりに変数名にしましたがこれならミスを防ぐべく略してはいけませんよね(LよりWidthのほうが適していました)
cateye

2018/08/01 15:19 編集

>小数点ではなく単にドットを表しています。・・・これは大変失礼しましたmm 解決してよかったですv^^ 蛇足ですが、operator[]は例外を発生しませんが、at()は例外を発生するので、最初に書いた回答になりました。
saguaro

2018/08/02 10:46

そのような関数(呼称が合ってるかわからないのですが)があるのですね、参考にさせていただきます
cateye

2018/08/02 12:01 編集

string型には、string中の1文字を指定するインタフェースが2つ(だと思ったw)“[]とat()”があります。ただ、先に書いたように使った時の挙動が違うので注意が必要です。str[pos]と書いてposが範囲外の時は“未定義動作”となり何が起こるかわかりません。また、str.at(pos)と書いた時のposが範囲外の時は“out_of_range”の例外が発生します。
saguaro

2018/08/02 13:05

度々質問して申し訳ありませんが、[]のときは何が起こるかわからないがプログラムは進み続ける、()のときはエラーを吐いてくれるという解釈で合っていますか?また、int型にもある桁を指定するインターフェイスはありますか?探してもわからなくて毎回何回10で割れるか計算して最高位の桁数で割って....みたいな非常に無駄の多いような記述をしているのですが....
cateye

2018/08/02 13:30 編集

>プログラムは進み続ける・・・については、それすら分かりません。システムがクラッシュしてもしようがない状態です。intの桁指定はありません(私が知らないだけかも^^;)。・・・たぶんクラス一個作れば簡単に実装できると思いますが?
saguaro

2018/08/02 13:49

なるほど、つまりはどちらにせよ細心の注意を払う必要がありそうですね。 クラス....ですか....こればかりは聞いたことすら無いので自分の無学が原因ですので今からクラスに関するネットの記事読み漁ってそれでもわからなかったらまた別の質問をさせていただくかもしれません。この度は非常に助かりました!
cateye

2018/08/02 21:32 編集

ちょっと作ってみましたが(回答に追記)・・・エラーチェックも何もありませんw
saguaro

2018/08/02 14:16

なんと打ち込むのが早いこと.....!!すごいですね、目から鯛の鱗です。 自分の勉強が追いついてからじっくり噛み噛みさせていただきます....!ホントありがとうございます.....
guest

0

Eclipseか、VisualStudioを入れてデバッグしてみてはどうですか。
これらでは、任意の行で実行を止めて、変数の内容を確認したりできます

投稿2018/08/01 13:41

y_waiwai

総合スコア87719

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

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

saguaro

2018/08/01 14:53

!!!! 耳寄りな情報ありがとうございます!コードを書いてて変数が脳内でほつれてしまっていたので助かります...!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問