Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Glen654Ответов: 2

Вот функция, которая у меня есть, "Спрайт" - это объект в программе, а "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;
}
  • может быть, вы хотите преобразовать в char* , **(char)**(selectedSprite? neagoegab 28.11.2012
  • Почему вы вообще используете строки C в программе на C++? Используйте std::string и избавьте себя от горя. Paul R 28.11.2012
  • Пара предложений, не имеющих прямого отношения к проблеме. Во-первых, сохраните char вместо int. Во-вторых, сохраните нужный символ, 'a', 'b' и т. д. Таким образом, вам не придется выполнять непереносимое преобразование добавления 97. Pete Becker 28.11.2012

c++stringchar

Ответы

Ответ 1 · рейтинг 3 · hall.stephenk

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

        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 быть выделено внутри этой функции или передано вызывающей стороной.

Ответ 2 · рейтинг 2 · Chad

Ваш код в том виде, в котором он написан, будет иметь неопределенное поведение, потому что 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;
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы