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

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

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

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

Q&A

解決済

2回答

1146閲覧

添字範囲外アクセスの場所が分かりません

PC_breakman

総合スコア30

C++

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

0グッド

0クリップ

投稿2020/08/10 04:52

編集2020/08/10 05:03

質問事項

AtCoderのこちらの問題について、C++で下のようなコードを書いたのですが、添え字範囲外アクセスのエラーが出ました。どの部分が添え字オーバーしているのか全く分からないので、教えていただけないでしょうか。

###期待される実行結果

入力例

3 5 aaaaa aaaaa aaaaa

出力例

####### #aaaaa# #aaaaa# #aaaaa# #######

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

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

該当のソースコード

C++

1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 int H, W; 6 cin >> H >> W; 7 vector<string> a(H); 8 vector<string> b(H + 2); 9 for(int i = 0; i < H; i++){ 10 cin >> a.at(i); 11 } 12 for(int i = 0; i < H + 2; i++){ 13 for(int j = 0; j < W + 2; j++){ 14 (b.at(i)).at(j) = '#'; 15 } 16 } 17 for(int i = 0; i < H; i++){ 18 for(int j = 0; j < W; j++){ 19 (b.at(i + 1)).at(j + 1) = (a.at(i)).at(j); 20 } 21 } 22 for(int i = 0; i < H + 2; i++){ 23 cout << b.at(i) << endl; 24 } 25}

試したこと

このコードだとうまくいきます。

C++

1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 int H, W; 6 cin >> H >> W; 7 vector<string> a(H); 8 for(int i = 0; i < H + 2; i++){ 9 if(i == 0 || i == H + 1){ 10 for(int j = 0; j < W + 2; j++){ 11 cout << "#"; 12 } 13 }else{ 14 for(int j = 0; j < W + 2; j++){ 15 if(j == 0 || j == W + 1){ 16 cout << "#"; 17 }else{ 18 cout << (a.at(i - 1)).at(j - 1); 19 } 20 } 21 } 22 cout << endl; 23 } 24}

###補足
この部分が問題なのでしょうか...

C++

1 for(int i = 0; i < H; i++){ 2 for(int j = 0; j < W; j++){ 3 (b.at(i + 1)).at(j + 1) = (a.at(i)).at(j); 4 } 5 }

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

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

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

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

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

guest

回答2

0

ベストアンサー

b の要素の string の size() は 0 です。
修正方法は

diff

1- (b.at(i)).at(j) = '#'; 2+ b.at(i).push_back('#');

または

diff

1- vector<string> b(H + 2); 2+ vector<string> b(H + 2, string(' ', W + 2));

追記
vector<string> b(H + 2, string('#', W + 2)); とすれば、
最初の forの二重ループは不要になります。

投稿2020/08/10 05:37

編集2020/08/10 05:41
kazuma-s

総合スコア8224

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

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

PC_breakman

2020/08/10 05:47

push_backに直したら無事ACになりました。今後は積極的に使っていこうと思います。回答ありがとうございました。
guest

0

C++

1 cin >> H >> W; 2 vector<string> a(H); 3 vector<string> b(H + 2); // H+2 個の空文字列 4 for (int i = 0; i < H; i++) { 5 cin >> a.at(i); 6 } 7 for (int i = 0; i < H + 2; i++) { 8 for (int j = 0; j < W + 2; j++) { 9 (b.at(i)).at(j) = '#'; // 空文字列のj番目は存在しない 10 } 11 }

投稿2020/08/10 05:34

episteme

総合スコア16614

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

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

PC_breakman

2020/08/10 05:38

その書き方に問題があったのですね。回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問