2012-04-09 13 views
0

私は単純なXOR暗号化プログラムをコーディングしていましたが、関数の戻り値が私が見たいものではないことに気付きました。LPCSTR関数の戻り値はゴミとなります

私のコードで問題を見つけることができません。だれでも助けてくれますか?

はここでプログラムコードです:

#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; 
} 

答えて

3

あなたが持っているポインタがスタック上にstd::stringが所有しているメモリにある - std::stringがスコープの外に出たとき、それを解放し、その後、あなたはそれを読みました。 ではなく、std::stringを返す必要があります。

1

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

基本的にあなたのコードがに変換:

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

のいずれかのメモリを割り当てる(呼び出し側がそれを解放しなければなりません)、またはSTDを返す::文字列

3

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

std :: string changedを直接返します。