Скопируйте короткое целое в массив символов с 0

Мне трудно найти конкретный способ скопировать короткое целое число в массив символов.

Допустим, у меня есть:

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

и я хочу скопировать короткие целые числа в соответствующие массивы символов, заполнив пустые цифры нулями:

char value output
x    5     0005
y    12    0012

Как это можно сделать в с ++?

0

Решение

Самый простой будет.

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 элементов для нулевого символа

1

Другие решения

Во-первых, вы используете 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,

1

Я бы лично использовал поток для форматирования значений, конечно:

#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, не слишком полезен для создания форматированных значений.

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;
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector