我正在编写一个简单的XOR加密程序,然后我注意到函数的返回值不是我希望看到的那种。
我只是在我的代码中找不到问题,有人可以帮助我吗?
这是程序代码:
#include "windows.h"
#include "iostream"
using namespace std;
LPCSTR hasala(string original, char key){
string changed;
for (int temp = 0; temp < original.size(); temp++){
changed += original[temp] ^ (int(key) + temp) % 255;
}
cout << changed.c_str()<<"nn";//works, output "acagaca"
LPCSTR adart = changed.c_str();
cout << adart<<"nn";//works, output "acagaca"
return adart;
}
int main(){
cout << hasala("abcdefg", 0);//doesn't work, output "||||@ER|||"...
cout << "nn";
Sleep(8000);
return 0;
}
您拥有的指针是堆栈上std::string
拥有的内存 - 当std::string
超出范围时,它会释放它,然后您读取它。您必须返回std::string
,而不是LPCSTR
。
你返回的是 changed.c_str()
,它只是一个指向由 changed
管理的缓冲区的指针。 changed
是一个局部变量,在函数结束时被销毁,因此您最终会返回指向不再存在的内容的指针。
直接返回 std::string changed
。
您正在返回在堆栈上分配的局部变量。
基本上你的代码可以转换为:
LPCSTR hasala(string original, char key){
string changed;
return changed.c_str();
}
分配内存(调用方必须释放它)或返回 std::string