使用 C++,将 int 转换为 char 时出现问题,始终有 3 位数字

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

提问人:ROVguy 提问时间:6/22/2019 最后编辑:CuriouslyRecurringThoughtsROVguy 更新时间:6/24/2019 访问量:403

问:

我正在尝试转换一个值为 的整数并将其保存为 value 的字符。例子。 (如果有比 char 更好的方法,我全都听进去)1-360001-3601 = 00143 = 043349 = 349

我一直在寻找不同的方法,使用字符串或字符[]天气,但似乎无法正确。

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;
}

是:

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

应该是:

LOtrackAngle=7, Output is 16100719.

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

C++ 字符 类型转换 int

评论

0赞 Algirdas Preidžius 6/22/2019
sprintf(trackAngleCHR, "%d", LOtrackAngle);->sprintf(trackAngleCHR, "%03d", LOtrackAngle);,如文档中所述?
0赞 WhozCraig 6/22/2019
这是针对 .只需在设置适当的宽度、对齐方式和填充字符后使用 ostream。sprintfchar[4]
0赞 Yksisarvinen 6/23/2019
@AlgirdasPreidžius 这是一个很好的答案,为什么不发布呢?

答:

4赞 Yksisarvinen 6/22/2019 #1

由于您已经在使用流,因此我建议使用完全 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;
}

它不仅更简洁、更易于阅读,而且可以防止缓冲区溢出(如果您的号码由于某种原因不适合长度的缓冲区,您不会得到一些奇怪的 UB)4

评论

0赞 ROVguy 6/24/2019
谢谢Yksisarvinen。当我在代码中运行它时,它在流中留下了 1 或 2 个字符的间隙,而不是添加 0。我必须记住 setw() 以备将来出现问题。
0赞 Yksisarvinen 6/24/2019
@ROVguy 你说得对,我忘了更改填充字符。它现在应该可以工作了。
0赞 Alex Hodges 6/23/2019 #2

看看这个:

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;
}

使用这种方法,您可以保留原始字符串,也可以将其 memcpy 转换为 char[]。

编辑:如果需要,添加了一个衬里以插入 0。

评论

0赞 ROVguy 6/24/2019
谢谢亚历克斯。我使用了您的修复程序,因为它在没有数字的地方添加了 0,并在解决方案中使用了流。我必须阅读自动!
0赞 Alex Hodges 6/24/2019
@ROVguy 没问题。请记住接受一个答案是正确的答案,这样和你有同样问题的人就可以更快地找到解决方案。
0赞 PaulMcKenzie 6/23/2019 #3

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

#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