使用C++,将int转换为char,总是有3位数字
我正在尝试转换一个值为1-360的整数,并将其保存为值为001-360的字符。例1=001,43=043,349=349。 如果有比查更好的方法,我洗耳恭听 我使用字符串或char[]寻找了不同的方法,但似乎没有找到正确的方法 LOtrackAngle将是一个整数1-360使用C++,将int转换为char,总是有3位数字,c++,char,type-conversion,int,C++,Char,Type Conversion,Int,我正在尝试转换一个值为1-360的整数,并将其保存为值为001-360的字符。例1=001,43=043,349=349。 如果有比查更好的方法,我洗耳恭听 我使用字符串或char[]寻找了不同的方法,但似乎没有找到正确的方法 LOtrackAngle将是一个整数1-360 case 'q': case 'Q': { char trackAngleCHR[4]; sprintf(trackAngleCHR, "%d", LOtrackAngle); ss <<
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=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 < /P> < P>因为你已经使用了流,我建议完全使用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;
}
使用此方法,您可以保留原始字符串,或者将其memcpy为char[]
编辑:如果需要,添加一行以插入0。查看以下内容:
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。这里有一个不使用额外字符串或流的替代方法
#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";
}
这里有一个不使用额外字符串或流的替代方法
#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";
}
sprintftrackAngleCHR,%d,LOtrackAngle;->sprintftrackAngleCHR,%03d,LOtrackAngle;,如?中所述,sprintf是针对char的缓冲区溢出的一种方法[4]。设置适当的宽度、对齐和填充字符后,只需使用ostream。@AlgirdasPreidžius这是一个很好的答案,为什么不发布它呢?sprintftrackAngleCHR,%d,LOtrackAngle;->sprintftrackAngleCHR,%03d,LOtrackAngle;,如?中所述,sprintf是针对char的缓冲区溢出的一种方法[4]。在设置了适当的宽度、对齐和填充字符后,只需使用ostream即可。@AlgirdasPreidžius这是一个非常好的答案,为什么不发布它呢?谢谢Alex。我使用了您的修复程序,因为它在没有数字的地方添加了0,并在解决方案中使用了流。我得好好读一下汽车@没问题。记住接受正确的答案,这样与你有相同问题的人可以更快地找到解决方案。谢谢Alex。我使用了您的修复程序,因为它在没有数字的地方添加了0,并在解决方案中使用了流。我得好好读一下汽车@没问题。记住接受正确的答案,这样与你有相同问题的人可以更快地找到解决方案。谢谢Yksisarvinen。当我在代码中运行此命令时,它在流中留下了1或2个字符的间隔,而不是添加0。我必须记住setw以备将来出现问题。@ROVguy你说得对,我忘了更改填充字符。现在应该可以用了,谢谢你。当我在代码中运行此命令时,它在流中留下了1或2个字符的间隔,而不是添加0。我必须记住setw以备将来出现问题。@ROVguy你说得对,我忘了更改填充字符。现在应该可以了。