Используя C ++, проблема с преобразованием int в символ, всегда имеющий 3 цифры - PullRequest
1 голос
/ 22 июня 2019

Я пытаюсь преобразовать целое число со значением 1-360 и сохранить его как символ со значением 001-360.Примеры 1 = 001, 43 = 043, 349 = 349.(Если есть подход лучше, чем char, я весь слух)

Я искал разные подходы к погоде, используя string или char [], но, похоже, не могу понять это правильно.

LOtrackAngle будет целым числом 1-360

case 'q':
case 'Q':
{
    char trackAngleCHR[4];
    sprintf(trackAngleCHR, "%d", LOtrackAngle);
    ss << " 16"
       << "1" << trackAngleCHR << ""
       << "1"
       << "9";
    LOtrackAngle += 1;
    if (LOtrackAngle > 360)
    {
        LOtrackAngle = LOtrackAngle - 360;
    }
    break;
}

Is:

LOtrackAngle=248, Output is 16124819.
LOtrackAngle=34, Output is 1613419.
LOtrackAngle=7, Output is 161719.

Должно быть:

LOtrackAngle=7, Output is 16100719.

Мне нужно, чтобы они всегда были длиной 8 символов.

Ответы [ 3 ]

4 голосов
/ 22 июня 2019

Поскольку вы уже используете потоки, я рекомендую использовать полностью C ++ решения:

#include <iomanip> //for std::setw

case 'q':
case 'Q':
{
    ss << " 16" << "1" 
       << std::setw(3) << std::setfill('0') << LOtrackAngle
       << "1" << "9";

    LOtrackAngle += 1;
    if (LOtrackAngle > 360)
    {
        LOtrackAngle = LOtrackAngle - 360;
    }
    break;
}

Это не только более кратко и просто для чтения, но и безопасно от переполнения буфера (если ваш номер не помещается в буфер длины 4 по какой-то причине, вы не получите какой-то странный UB)

0 голосов
/ 22 июня 2019

Вот альтернатива, которая не использует дополнительные строки или потоки.

#include <cstring>
#include <iostream>

char* fill_char_array(char *arr, int size, int num)
{
    if ( size <= 0 )
       return arr;
    memset(arr, '0', size);  // set all positions to character 0
    arr[size-1] = 0;  // null terminate
    int index = size - 2;
    while (num > 0 && index >= 0)
    {
       arr[index] = (num % 10) + '0';  // set the digit in the array
       num /= 10;
       --index;
    }
    return arr;
}

int main()
{
    char trackAngleCHR[4];
    std::cout << fill_char_array(trackAngleCHR, 4, 38) << "\n";
    std::cout << fill_char_array(trackAngleCHR, 4, 1) << "\n";
    std::cout << fill_char_array(trackAngleCHR, 4, 534) << "\n";
}

Выход:

038
001
534
0 голосов
/ 22 июня 2019

Взгляните на это:

int main()
{
    int number = 360;
    char chars[4];
    auto str = std::to_string(number);
    str.insert(0, 3 - str.size(), '0');
    std::memcpy(chars,str.data(),str.size());

    return 0;
}

Используя этот метод, вы можете сохранить исходную строку или записать ее в char [].

РЕДАКТИРОВАТЬ: добавлен один вкладыш ввведите 0, если необходимо.

...