Преобразование целых чисел в char* С++

Вот функция, которая у меня есть, «Спрайт» — это объект в программе, а «GetSpriteAtPosition» просто возвращает указатель на правильный спрайт по координатам.

Моя проблема в том, что я храню букву в каждом спрайте в виде целого числа. 0 — это a, а 25 — это z, и все, что между ними, соответственно. Мне нужно, чтобы моя функция возвращала char*, который дает мне буквы ряда спрайтов, поэтому, если в программе спрайты написаны по буквам «abcdefgh», то это то, что мне нужно, чтобы эта функция распечатала. Есть сетка спрайтов 8x8, и я правильно получаю координаты, но получаю сообщение об ошибке, что я не могу преобразовать int в char* в отмеченной строке. Что я могу сделать, чтобы заставить это работать?

Заранее спасибо!

char* RowLetters(int row)
{
    char* pointer;
    for( int i = 0; i < 8; i++)
    {
        Sprite* selectedSprite = SpriteAtPosition(row*50, i * 50);
        if(selectedSprite != NULL)
        {
            char* temp = (char)(selectedSprite->Frame() + 97); //error here
            pointer = strcat(pointer, temp);
        }
        else
        {
            pointer = strcat(pointer, "test");
        }
    }
    return pointer;
}

person Glen654    schedule 27.11.2012    source источник
comment
может быть, вы хотите преобразовать в char* , **(char)**(selectedSprite?   -  person neagoegab    schedule 28.11.2012
comment
Почему вы вообще используете строки C в программе на C++? Используйте std::string и избавьте себя от горя.   -  person Paul R    schedule 28.11.2012
comment
Пара предложений, не имеющих прямого отношения к проблеме. Во-первых, сохраните char вместо int. Во-вторых, сохраните нужный символ, 'a', 'b' и т. д. Таким образом, вам не придется выполнять непереносимое преобразование добавления 97.   -  person Pete Becker    schedule 28.11.2012


Ответы (2)


Попробуй это:

        char temp = (char)(selectedSprite->Frame() + 97);
        pointer = strcat(pointer, &temp);

Я изменил переменную на стандартную char, а не на указатель, а затем передал ссылку на strcat() с помощью оператора &.

ИЗМЕНИТЬ:

Как указано в комментариях, это не работает, потому что &temp не завершается NULL. Раньше я обходил это, когда программировал больше C, делая следующее.

        char temp[2];
        temp[0] = (char)(selectedSprite->Frame() + 97);
        temp[1] = '\0';
        pointer = strcat(pointer, temp);

Конечно, массив temp можно было бы объявить вне цикла for() для немного лучшей производительности (теоретически).

Ничто из этого не решает другие проблемы с кодом, таким как pointer, никогда не объявляемым. Я думаю, что более широкое понимание вызывающей функции было бы для того, чтобы определить, должно ли pointer быть выделено внутри этой функции или передано вызывающей стороной.

person hall.stephenk    schedule 27.11.2012
comment
@Chad: Да, похоже, это будет проблемой, когда вы запустите код. Но приведенная выше модификация должна, по крайней мере, позволить ей скомпилироваться, что решает исходную проблему в посте. - person hall.stephenk; 28.11.2012
comment
Поскольку &temp, скорее всего, не будет заканчиваться нулем, это также будет проблемой. Хотя это исправляет ошибку компилятора, это приводит к другим видам плохого поведения. - person Chad; 28.11.2012
comment
Ошибка времени компиляции бесконечно лучше, чем ошибка времени выполнения. См. этот связанный вопрос: stackoverflow. ком/вопросы/4834811/ - person Chad; 28.11.2012

Ваш код в том виде, в котором он написан, будет иметь неопределенное поведение, потому что pointer не инициализирован и не указывает на какую-либо допустимую память, которую вы выделили (для хранения соответствующей длины букв в строке.

Если это действительно C++, как вы утверждаете, то вы не хотите возвращать char* из этой функции, так как это подразумевает, что у вас есть статическая строка, уже выделенная в этой функции (гадость), или вы будете динамически выделять строку в этой функции, и вызывающий должен освободить ее (фу).

Ни один из этих вариантов не идеален.

Я бы предложил очень простое изменение, чтобы вернуть std::string, например:

std::string RowLetters(int row)
{
    std::string pointer;
    for( int i = 0; i < 8; i++)
    {
        Sprite* selectedSprite = SpriteAtPosition(row*50, i * 50);
        if(selectedSprite != NULL)
        {
            pointer.push_back((char)(selectedSprite->Frame() + 97));
        }
        else
        {
            // ???
            // pointer = strcat(pointer, "test");
        }
    }

    return pointer;
}
person Chad    schedule 27.11.2012