2012-04-09 3 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(); 
} 

중 메모리를 할당 (발신자를 해제해야합니다) 또는 표준 : : 문자열

3

당신은 changed.c_str()를 반환하고,에 단지 포인터 반환 버퍼는 changed에 의해 관리됩니다. changed은 지역 변수이며 함수가 끝나면 소멸되므로 더 이상 존재하지 않는 것에 대한 포인터를 반환하게됩니다.

std :: string changed을 직접 반환하십시오.