Мне трудно найти конкретный способ скопировать короткое целое число в массив символов.
Допустим, у меня есть:
unsigned short xVal = 5;
unsigned short yVal = 12;
char x[3];
char y[3];
и я хочу скопировать короткие целые числа в соответствующие массивы символов, заполнив пустые цифры нулями:
char value output
x 5 0005
y 12 0012
Как это можно сделать в с ++?
Самый простой будет.
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*
массивы. За 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
,
Я бы лично использовал поток для форматирования значений, конечно:
#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
, не слишком полезен для создания форматированных значений.
Я изменил пример @ 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;