2017-03-13 36 views
-3


我的代码有问题。
当我运行此代码时,出现正确答案。一段时间后,我看到一个错误,显示“程序已停止工作”(0xC0000005)。你有什么想法为什么该程序无法正常工作?一切似乎都没问题。C++“程序已停止工作” - ROT-107(凯撒密码)

#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

解决此类问题的正确工具是您的调试器。在*堆栈溢出问题之前,您应该逐行执行您的代码。如需更多帮助,请阅读[如何调试小程序(由Eric Lippert撰写)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您应该\编辑您的问题,以包含一个[最小,完整和可验证](http://stackoverflow.com/help/mcve)示例,该示例再现了您的问题,以及您在调试器。 –

+0

'word_out [j]' - 预先确定了“word_out”的大小?将该行更改为'word_out.at(j)',这应该能够让你知道发生了什么。 – PaulMcKenzie

回答

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());