使用0s复制char数组中的短整数

时间:2014-01-09 21:48:16

标签: c++ c arrays char short

我很难找到将短整数复制到char数组的特定方法。

我们说我有:

unsigned short xVal = 5;
unsigned short yVal = 12;
char x[3];
char y[3];

我希望将短整数复制到相应的char数组中,用0s填充空数字:

char value output
x    5     0005
y    12    0012

如何在c ++中完成?

4 个答案:

答案 0 :(得分:1)

首先,您使用的是char*数组。对于char数组,您可以使用memcpy

unsigned short xVal = 5;
char x[3];
memset(x,0,sizeof(x));
memcpy(x,&xVal ,sizeof(xVal));

您可能希望确保sizeof unsigned short实际上是2个字节。它很可能是,但检查是一个好主意。 char的输出不一定符合您的预期。一方面,它取决于系统的字节顺序。上面的代码只会将值的位模式存储在char数组中。

如果您确定未签名的短值小到足以存储在char变量中,那么您可以尝试将它们转换为char。如果它们大于128,尽管这是不可能的。

如果您希望将这些数字通用转换为C ++中的字符串,那么您可以使用ostringstream

#include <string>
#include <sstream>

unsigned short num = 56; 
std::ostringstream ss;
ss << num;
std::string str_number = ss.str();   // str_number now = "56"

这样做的另一个好处是std::string会根据unsigned short中的位数自动调整大小。

答案 1 :(得分:1)

最简单的是。

unsigned short xVal = 5;
unsigned short yVal = 12;
char x[5];
char y[5];
sprintf(x,"%04u",xVal);
sprintf(y,"%04u",yVal);
printf("%s\n",x);
printf("%s\n",y);

请注意,x和y应声明为空字符

的5个元素的char数组

答案 2 :(得分:0)

我个人会使用流来格式化值,当然:

#include <iostream>
#include <streambuf>
struct formatter: virtual std::streambuf, std::ostream {
    template <int Size>
    formatter(char (&buffer)[Size])
        : std::ostream(this) {
        std::fill(buffer, buffer + Size, 0);
        this->setp(buffer, buffer + Size);
        this->width(4);
        this->fill('0');
    }
};

// ... 
char x[5];
char y[5];
formatter(x) << xVal << std::ends;
formatter(y) << yVal << std::ends;

数组的原始类型char*[3],即指向char的三个指针的数组,对于创建格式化值并不太有用。

答案 3 :(得分:0)

我通过以下方式修改了@ mathematician1975的示例。我认为这更正确。该代码需要包含标题<limits><cstdio><iostream>

const int N = std::numeric_limits<unsigned short>::digits10 + 1;
char s[N + sizeof( '\0' )];
unsigned short yVal = 12;

std::sprintf( s, "%0*hu", N, yVal );
std::cout << s << std::endl;

对于标准算法的业余爱好者,我可以建议以下代码

const int N = std::numeric_limits<unsigned short>::digits10 + 1;
char s[N + sizeof( '\0' )] = {};
int x = 12;

std::generate( std::reverse_iterator<char *>( s + N ), 
               std::reverse_iterator<char *>( s ),
               [=] () mutable -> char 
               {
                   char c =  x % 10 + '0';
                   x /= 10;
                   return ( c );
               } );

std::cout << s << std::endl;