使用C ,将转换为char的问题始终具有3位数字

Using C++, Issue with converting int to char always having 3 digits

本文关键字:数字 3位 问题 转换 char 使用      更新时间:2023-10-16

我正在尝试转换一个具有1-360值的整数,并将其保存为值001-360的字符。示例1 = 00143 = 043349 = 349。(如果有比Char更好的方法(

我已经使用字符串或char []寻找了不同的方法,但似乎无法正确。

lotrackangle将是一个int编号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;
}

是:

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

应该是:

LOtrackAngle=7, Output is 16100719.

我需要这些总是长8个字符。

由于您已经使用了流,我建议使用完全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(

看一下:

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。

这是不使用额外的字符串或流的替代方案。

#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