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

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

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

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

Q&A

3回答

2993閲覧

C++で以下のソースがランタイムエラーになる原因を教えてください

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2015/09/13 17:39

c++初心者です。

以下の問題を解いており、自分のパソコン(visual studio 2013)では正常に動作するのですが、
オンラインジャッジに提出するとランタイムエラーというものが出ます。

http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=1511631#1

原因がわかる方がいましたら教えていただきたく存じます。

#include <iostream>
#include <vector>
#include<string>
#include<sstream>
#define CAPACITY 9

namespace stoi{//stoiのエラーを回避するため名前空間で宣言した

int stoi(std::string str){ int ret; std:: stringstream ss; ss << str; ss >> ret; return ret; }

}
class OverDigit{

public:

int num_a[CAPACITY]; int num_b[CAPACITY]; OverDigit(std::string str_a, std::string str_b); void ChangeDigit(std::string str,int num[]); void Add();

};

OverDigit::OverDigit(std::string str_a,std::string str_b){

ChangeDigit(str_a, num_a); ChangeDigit(str_b, num_b);

}

void OverDigit::ChangeDigit(std::string str, int num[]){

std::vector <int> num_str(CAPACITY, 0); int loc = CAPACITY, k = 8; int str_Max, str_rest; str_Max = str.length() / CAPACITY;// str_rest = str.length() % CAPACITY; for (int j = str.length() - CAPACITY; str_Max > 0; j = j-CAPACITY){ num_str[k] = stoi::stoi(str.substr(j, CAPACITY)); loc = k; k--; str_Max--; } //最後に余り分の文字を配列に入れる if(str_rest!=0)num_str[loc - 1] = stoi::stoi(str.substr(0, str_rest)); for (int j = 0; j < CAPACITY; j++){ num[j]=num_str[j]; }

}
//80桁までの足し算
void OverDigit::Add(){

int num_ans[CAPACITY] = {}; int fat,overflow=0,count=0; for (int j = CAPACITY-1; j >0; j--){ if (num_a[j] + num_b[j]<=999999999){ num_ans[j] = num_a[j] + num_b[j]; } else if (num_a[j] + num_b[j] > 999999999){ fat = (num_a[j] + num_b[j]) - 1000000000; num_ans[j] = fat; num_a[j - 1]++; } } if (num_a[0] + num_b[0] > 99999999){ overflow = 1; } else{ num_ans[0]= num_a[0] + num_b[0]; } if (overflow == 1){ std::cout << "overflow" << std::endl; } else { for (int j = 0; j < CAPACITY; j++){ if (num_ans[j] != 0){ count++; std::cout << num_ans[j]; } else if (num_ans[j] == 0 && count >= 1){ std::cout << "000000000"; } }std::cout << std::endl; }

};

int main(){

//vector配列を用いた80桁の計算 int N; std::string str_a, str_b; std::cin >> N; std::cin.ignore(); for (int i = 0; i < N; i++){ getline(std::cin, str_a); getline(std::cin, str_b); OverDigit OverDigit_a(str_a,str_b);//オブジェクト OverDigit_a.Add(); } return 0;

}

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

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

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

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

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

guest

回答3

0

ChangeDigit()内の以下のループで、jに対するチェックがないので、jがマイナスになる可能性があります。

for (int j = str.length() - CAPACITY; str_Max > 0; j = j-CAPACITY){ num_str[k] = stoi::stoi(str.substr(j, CAPACITY)); loc = k; k--; str_Max--; }

str_Maxでチェックするはずだったようにも思えますが、別に使わなくてもこんな感じでいいんじゃないでしょうか。

C++

1 for (int j = str.length() - CAPACITY; j >= 0 ; j = j - CAPACITY) { 2 num_str[k] = stoi::stoi(str.substr(j, CAPACITY)); 3 loc = k; 4 k--; 5 }

投稿2015/09/14 10:01

KoichiSugiyama

総合スコア3041

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

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

0

与えられた数のオーバーフローチェックが抜けています。
Visual Studioでも82桁以上の数を入力すると落ちるのではないでしょうか?

投稿2015/09/14 06:12

fuzzball

総合スコア16731

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

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

0

c

1num_a[j - 1]++;

というところ、j==CAPACITY-1のときに範囲外メモリアクセスになりますね。

投稿2015/09/14 03:54

yuba

総合スコア5568

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

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

fuzzball

2015/09/14 04:28

j==CAPACITY-1のときは num_a[CAPACITY-2] だから範囲内では?
yuba

2015/09/14 04:46

おおっと、そうです。ここは間違いじゃないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問