0

単純な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()<<"\n\n";//works, output "acagaca"

  LPCSTR adart = changed.c_str();

  cout << adart<<"\n\n";//works, output "acagaca"

  return adart;

}

int main(){

    cout << hasala("abcdefg", 0);//doesn't work, output "||||@ER|||"...

    cout << "\n\n";

    Sleep(8000);

    return 0;
}
4

3 に答える 3

3

std::stringあなたが持っているポインタは、スタック上のが所有するメモリへのポインタですstd::string。ではなく、返さなければなりませstd::stringLPCSTR

于 2012-04-09T13:04:52.343 に答える
3

changed.c_str()が管理するバッファへの単なるポインタである を返しますchangedchangedはローカル変数であり、関数が終了すると破棄されるため、存在しないものへのポインターを返すことになります。

std::stringchangedを直接返します。

于 2012-04-09T13:06:49.693 に答える
1

スタックに割り当てられたローカル変数を返しています。

基本的にあなたのコードは次のように変換されます:

LPCSTR hasala(string original, char key){
string changed;
return changed.c_str();
}

メモリを割り当てる (呼び出し側で解放する必要がある) か、std::string を返す

于 2012-04-09T13:06:38.807 に答える