提问人:ROVguy 提问时间:6/22/2019 最后编辑:CuriouslyRecurringThoughtsROVguy 更新时间:6/24/2019 访问量:403
使用 C++,将 int 转换为 char 时出现问题,始终有 3 位数字
Using C++, Issue with converting int to char always having 3 digits
问:
我正在尝试转换一个值为 的整数并将其保存为 value 的字符。例子。
(如果有比 char 更好的方法,我全都听进去)1-360
001-360
1 = 001
43 = 043
349 = 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 个字符长。
答:
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
评论
sprintf(trackAngleCHR, "%d", LOtrackAngle);
->sprintf(trackAngleCHR, "%03d", LOtrackAngle);
,如文档中所述?sprintf
char[4]