Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C++,将int转换为char,总是有3位数字_C++_Char_Type Conversion_Int - Fatal编程技术网

使用C++,将int转换为char,总是有3位数字

使用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 <<

我正在尝试转换一个值为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 << " 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你说得对,我忘了更改填充字符。现在应该可以了。