У меня есть следующая функция в c++
char* Test::convertToSHA(const char* cc) {
const char* salt ="sh$^$#@!&7hbfvatfacv@@@@bagg=shjgvshvcbschj";
time_t currentTime;
time(¤tTime);
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");
Это приводит к сбою моего кода. Есть ли проблема с возвращением строки? Как я могу вернуться из этой функции?
Я предполагаю, что вы используете эту библиотеку. Мне C++
странным, что он утверждает, что он написан в C++
но не использует идиомы C++
. Функция изменяет указатель и ничего не возвращает, поэтому вам нужна локальная переменная. К счастью для вас, std::string
радостью примет аргумент 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;
}
Вы никогда не сможете вернуть локальный указатель на C или 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 (однако вы все равно не можете вернуть указатель).
std::string
.new hexstring
, либо пусть вызывающаяconvertToSHA
выделяет память и передает ее вconvertToSHA
. Но лучший способ - вернуть std :: string (или вернуть по ссылке), так как вы используете c ++.