как бы я преобразовал это, чтобы возвращать char * не использовать std :: string, просто хочу узнать другие способы сделать это без std :: string
string getName(DWORD Address)
{
DWORD BaseDword = ReadBaseDword(Address);
int size = ReadCharSize();
string name = "";
for (int i = 0; i < size - 1; i++)
{
char c = ReadCharArrayChar(i);
name += c;
}
return name;
}
Другие способы уродливы, что является одной из причин std::string
существует :). Но в образовательных целях, вот как вы могли бы вернуть char*
(по просьбе):
// caller is responsible for deleting the return value
char* getEntityName(DWORD Address)
{
DWORD BaseDword = ReadBaseDword(Address); // (not sure what this achieves)
int size = ReadCharSize();
char* name = new char[size];
name[size - 1] = '\0';
for (int i = 0; i < size - 1; i++)
{
char c = ReadCharArrayChar[i](); // odd looking, but I'll assume this works
name[i] = c;
}
return name;
}
Аналогичный вариант по-прежнему использует необработанный указатель для буфера, но вызывающий его передает его (вместе с его размером):
// returns: true iff the buffer was successfully populated with the name
// exceptions might be a better choice, but let keep things simple here
bool getEntityName(DWORD Address, char* buffer, int maxSize)
{
DWORD BaseDword = ReadBaseDword(Address); // (not sure what this achieves?)
int size = ReadCharSize();
if(size > maxSize)
return false;
buffer[size - 1] = '\0';
for (int i = 0; i < size - 1; i++)
{
char c = ReadCharArrayChar[i](); // odd looking, but I'll assume this works
buffer[i] = c;
}
return true;
}
Последний вариант позволил бы, например:
char buffer[100];
getEntityName(getAddress(), buffer, 100);
char * getEntityName(DWORD Address)
{
DWORD BaseDword = ReadBaseDword(Address);
int size = ReadCharSize();
char* name = malloc (size);
for (int i = 0; i < size - 1; i++)
{
name[i] = ReadCharArrayChar[i]();
}
name[size - 1] = 0;
return name;
}
Обратите внимание, что вызывающий абонент должен free
возвращаемое значение, когда оно будет сделано с ним. Это предполагает, что size
включает конечный нулевой байт, который, как представляется, приведен в примере кода.
malloc
должен быть явно приведен к char*
, если я правильно помню.
malloc
возвращает void *
, поэтому приведение не требуется.
Если бы я абсолютно не мог использовать std::string
, я бы использовал std::vector<char>
для этого:
std::vector<char> getName(DWORD Address)
{
DWORD BaseDword = ReadBaseDword(Address);
const int size = ReadCharSize();
std::vector<char> name(size);
for (int i = 0; i < size - 1; i++)
{
name[i] = ReadCharArrayChar(i);
}
name[size - 1] = '\0';
return name;
}
или std::unique_ptr<char[]>
Если бы я знал, что вызывающему абоненту никогда не потребуется изменять результат:
std::unique_ptr<char[]> getName(DWORD Address)
{
DWORD BaseDword = ReadBaseDword(Address);
const int size = ReadCharSize();
std::unique_ptr<char[]> name(new char[size]);
for (int i = 0; i < size - 1; i++)
{
name[i] = ReadCharArrayChar(i);
}
name[size - 1] = '\0';
return name;
}
std:string
. Подсказка:c_str()
- вы, вероятно, тоже захотите использоватьstrdup