C ++"程序已停止工作" - ROT-107(凯撒密码)

时间:2017-03-13 21:26:41

标签: c++ caesar-cipher


我的代码有问题。
当我运行此代码时,会出现正确的答案。过了一会儿,我看到一个错误,显示"程序已停止工作" (0000005)。你知道为什么程序不能正常工作吗?一切似乎都没问题。

#include <iostream>
#include <fstream>

using namespace std;

int k = 107;
string word;
string word_out;
fstream plik;
fstream plik_out;

int main() {
plik.open("Dane_PR2/dane_6_1.txt", ios::in);
plik_out.open("Dane_PR2/wynik_6_1.txt", ios::out);
for (int i = 0; i < 100; i++)
{
    plik >> word;
    for (int j = 0; j < word.length(); j++)
    {

        while (k>26)
        {
            k=k-26;
        }

            word_out[j] = word[j] + k;
            if (word_out[j] > 90) word_out[j] = word_out[j] - 26;

        cout << word_out[j];
        plik_out << word_out[j];
    }
    cout << endl;
    plik_out << endl;
    }
    plik.close();
    plik_out.close();
    return 0;
}

这里有输入数据 - 我的程序读取的txt文件:

http://www74.zippyshare.com/v/4i6fg2NB/file.html

1 个答案:

答案 0 :(得分:1)

一个主要问题是您正在访问word_out字符串越界:

word_out[j] = word[j] + k;
执行此行时

word_out为空,因此字符串中没有索引j

将该行更改为:

word_out.at(j) = word[j] + k;

现在您应该抛出std::out_of_range异常而不是隐藏的访问冲突错误。

所以你需要修改你的程序,这样你才不会出界。一种可能的方法是在使用之前调整word_out字符串的大小。

plik >> word;
word_out.resize(plik.size());