邮件加密程序崩溃

时间:2018-09-23 16:29:20

标签: c++ string encryption

当我尝试编译它时,没有错误。然后,我运行编译的文件,它崩溃了,没有错误。

  

程序已停止工作:关闭或调试

我的程序的目标是先加密然后解密消息。

这是一个代码:

#include <iostream>
#include <string>

using namespace std;

char Encrypt(char Char) { return Char * Char / 2; }
char Decrypt(char Char) { return Char * 2 / Char; }
int main(int argc, char **argv) {
  string text = "Hello World, guys!";
  string encryptedtext;
  string decryptedtext;
  for (int i = 0; i <= text.size(); i++) {
    encryptedtext += Encrypt(text[i]);
  }
  cout << encryptedtext;
  for (int i = 0; i <= encryptedtext.size(); i++) {
    decryptedtext += Decrypt(encryptedtext[i]);
  }
  cout << decryptedtext;
}

我看到“进程在0.6444秒后退出,返回值3221225620” 伙计们,我是怎么说的,但错误是一样的。这是代码:

#include <iostream>
#include <string>

using namespace std;

char Encrypt(char Char) {

return Char * Char / 2;

}

char Decrypt(char Char) {

    return Char * 2 / Char;

}

int main(int argc, char** argv) {
string text = "Hello World, guys!";
string encryptedtext;
string decryptedtext;
for (char ch : text) {
encryptedtext += Encrypt(ch);
}
cout << encryptedtext;
for (char ch : encryptedtext) {
decryptedtext += Decrypt(ch);
}
cout << decryptedtext;
}

2 个答案:

答案 0 :(得分:2)

您的for循环错误

val env = StreamExecutionEnvironment.getExecutionEnvironment

val s = env.fromCollection(List("a", "b", "c", "d", "e"))
val t = env.addSource((context: SourceContext[String]) => {
  while(true) {
    Thread.sleep(100)
    context.collect("dummy")
  }
})

s.union(t)
  .filter(_ != "dummy")
  .windowAll(TumblingProcessingTimeWindows.of(Time.seconds(1)))
  .process(new ProcessAllWindowFunction[String, String, TimeWindow] {
    override def process(context: Context, elements: Iterable[String], out: Collector[String]): Unit = {
      out.collect(elements.toList.sorted.toString())
    }
  })
  .print()

env.execute()

应该是

for (int i = 0; i <= text.size(); i++) {
    encryptedtext += Encrypt(text[i]);
}

,第二个循环出现相同的错误。

但是更好的是基于范围的循环

for (int i = 0; i < text.size(); i++) {   // use < not <=
    encryptedtext += Encrypt(text[i]);
}

更容易理解,并且避免了此类错误。

答案 1 :(得分:0)

如果将3221225620转换为十六进制,则会得到0xC0000094,这是Windows错误代码“被零除”。

这是由for循环引起的:

for (int i = 0; i <= text.size(); i++)

您传递给i的{​​{1}}的最后一个值为text[i],但是text.size()中的最后一个元素为text。这是未定义的行为,但是text[text.size()-1]的实现大概为null会终止字符串缓冲区,因此std::string返回text[text.size()]。这导致\0被传递到\0,从而产生Decrypt错误。正确的for循环是:

divide by zero

请注意,您的算法无法正常运行,因为for (int i = 0; i < text.size(); i++) 并非Decrypt的反向,并且从Encrypt返回的值溢出了Encrypt中可存储的范围。这还会产生附加的零除错误,例如空格字符的值为char3232 * 32 / 2,当被截断为512时会得到char