用 0 复制 char 数组中的短整数
Posted
技术标签:
【中文标题】用 0 复制 char 数组中的短整数【英文标题】:Copy short integer in char array with 0s 【发布时间】:2014-01-09 21:48:15 【问题描述】:我很难找到将短整数复制到 char 数组中的特定方法。
假设我有:
unsigned short xVal = 5;
unsigned short yVal = 12;
char x[3];
char y[3];
我想将短整数复制到相应的 char 数组中,用 0 填充空数字:
char value output
x 5 0005
y 12 0012
如何用c++实现?
【问题讨论】:
那些不是char
数组。 C 还是 C++?选择一个...
我的意思是没有指针'*'的字符数组。很抱歉这个错误。
你想要的是获取/打印短的十进制字符串表示。如果你写“复制”,这意味着你想把短字节复制到数组中。您应该编辑标题
【参考方案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】:首先,您使用的是char*
数组。对于char
数组,您可以使用memcpy
unsigned short xVal = 5;
char x[3];
memset(x,0,sizeof(x));
memcpy(x,&xVal ,sizeof(xVal));
您可能希望首先确保 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
中的位数自动调整大小的额外优势。
【讨论】:
【参考方案3】:当然,我个人会使用流来格式化值:
#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
的指针的数组,对于创建格式化值并不太有用。
【讨论】:
【参考方案4】:我通过以下方式修改了@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;
【讨论】:
以上是关于用 0 复制 char 数组中的短整数的主要内容,如果未能解决你的问题,请参考以下文章