2013-12-26 6 views
0

У меня есть следующие функции в C++Как вернуть символ * из функции в C++

char* Test::convertToSHA(const char* cc) { 

    const char* salt ="sh$^$#@!&[email protected]@@@bagg=shjgvshvcbschj"; 
    time_t currentTime; 
    time(&currentTime); 
    CCString startTimeString; 
    startTimeString.createWithFormat("%d", currentTime); 

    std::string s = cc; 
    s += startTimeString.getCString(); 
    s += salt; 

    char *str = new char[strlen(s.c_str()) + 1]; 
    int length=strlen(str); 
    unsigned char hash[length*2]; 
    char hexstring[41]; 
    sha1::calc(str,length,hash); 
    sha1::toHexString(hash, hexstring); 

    return hexstring; 
} 

И в вызове я использую

char* output=NULL; 
output= Test::convertToSHA("hello"); 

Это вызывает мой код аварии. Есть ли проблема с возвращением строки? Как я могу вернуться из этой функции?

+2

Это должно действительно вернуть строку 'std :: string'. – chris

+0

НЕ возвращать переменные стека. Либо «новая шестнадцатеричная строка», либо позвольте вызывающему абоненту выделить память и передать ее в «convertToSHA». Но лучший способ - вернуть std :: string (или вернуть по ссылке), поскольку вы используете C++. – Mine

+1

Можете ли, пожалуйста, показать мне, как? – AndroidDev

ответ

3

Я предполагаю, что вы используете это library. Мне показалось странным, что он утверждает, что он написан в C++, но не использует идиомы C++. Функция изменяет указатель и ничего не возвращает, поэтому вам нужна локальная переменная. К счастью для вас, std::string s с радостью примет аргумент char [].

std::string Test::convertToSHA(const char* cc) { 
    // ... 
    char hexstring[41]; 
    sha1::calc(str,length,hash); 
    sha1::toHexString(hash, hexstring); 
    std::string ret(hexstring); 

    return ret; 
} 
+0

Да, спасибо. Я использую эту Библиотеку. Теперь работает. Спасибо за вашу помощь. – AndroidDev

5

You can never return a local pointer in C or C++. Вместо либо передать указатель в качестве параметра:

void Test::convertToSHA(const char* cc, const char* hexstring) { 

    //no change to body 
    //no return statement needed 
} 

//then when calling the function: 

char hexstring[41]; 

convertToSHA(cc, hexstring); 

//hexstring has been modified 

Или просто использовать std::string вместо этого. Используйте c_str(), если вам нужно преобразовать строку c-style (однако вы все равно не можете вернуть указатель).

+0

Я изменил код. Его все еще грохот. – AndroidDev

+1

@BadLuckBrian Покажите нам новый код. – ApproachingDarknessFish

Смежные вопросы