Чтение char (указатель char)

0

как бы я преобразовал это, чтобы возвращать 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;
}
  • 4
    Ну ... Просто не надо.
  • 0
    Посмотрев документацию по std:string . Подсказка: c_str() - вы, вероятно, тоже захотите использовать strdup
Показать ещё 3 комментария
Теги:

3 ответа

4

Другие способы уродливы, что является одной из причин 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);
  • 0
    Вам не нужно удалять новый символ [размер]?
  • 2
    @ Натан Вызывающий код должен будет сделать это в конце концов.
Показать ещё 2 комментария
2
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 включает конечный нулевой байт, который, как представляется, приведен в примере кода.

  • 0
    Проголосовано, но результат malloc должен быть явно приведен к char* , если я правильно помню.
  • 0
    @dlf malloc возвращает void * , поэтому приведение не требуется.
Показать ещё 5 комментариев
1

Если бы я абсолютно не мог использовать 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;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню