【问题标题】:Copy short integer in char array with 0s用 0 复制 char 数组中的短整数
【发布时间】: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++?选择一个...
  • 我的意思是没有指针'*'的字符数组。很抱歉这个错误。
  • 你想要的是获取/打印短的十进制字符串表示。如果你写“复制”,这意味着你想把短字节复制到数组中。您应该编辑标题

标签: c++ c arrays char short


【解决方案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 的示例。我认为它更正确。代码需要包含标题&lt;limits&gt;&lt;cstdio&gt;&lt;iostream&gt;

        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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-15
          • 1970-01-01
          • 1970-01-01
          • 2020-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多