Заполните массив char фиксированного размера целыми числами в C ++ - PullRequest
1 голос
/ 26 сентября 2019

Я хочу хранить целые числа в массиве символов, например: 0 до 1449, я проверял другие записи и пробовал memset, sprinf и т. Д., Но при печати внутри массива char я получаю либо бессмысленные символы, либо нечитаемые символы.Кто-нибудь может помочь, пожалуйста?

Я проверил дублирующую ссылку, однако я не пытаюсь напечатать int в char, я хочу сохранить int в массиве char.Но я попробовал buf[i] = static_cast<char>(i); внутри цикла, но это не сработало.Приведение не сработало.

Последнее, что я попробовал, выглядит так: char buf [1450];

for (int i = 0; i < 1449; i++)
{
    memset(buf, ' '+ i, 1450);
    cout << buf[i];
}

Вывод: here

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Вам нужно будет лучше объяснить, что именно вы хотите, потому что "хранить целые числа в массиве символов" - это именно то, что делает этот код:

char buf[1450];

for (int i = 0; i < 1450; i++)
{
    buf[i] = static_cast<char>(i);
    std::cout << buf[i];
}

Да, вывод похож на то, что выРисунок показывает, но это также правильный вывод.

Когда вы используете отладчик для просмотра buf после цикла, тогда он содержит: 0, 1, 2, 3, ..., 126, 127, -128, -127, ..., 0, 1, 2, 3, ... и так далее, что является ожидаемым заданным содержимымчто мы пытаемся поместить числа 0-1449 в целочисленный тип, который (в данном случае *) может содержать диапазон [-128; 127].

Если это не то поведение, которое вы ищете (звучит так, будто это не так), тогда вам нужно более подробно описать ваши требования, иначе мы не сможем вам помочь.

(*) У персонажа должна быть возможность содержать представителя персонажа.На многих / большинстве систем это 8 бит, но размер зависит от системы и может быть больше.


Новый ответ.

Спасибо за разъяснения, я считаю, чтовам нужно что-то вроде этого:

int32_t before = 1093821061; // Int you want to transmit

uint8_t buf[4];
buf[0] = static_cast<uint8_t>((before >> 0) & 0xff);
buf[1] = static_cast<uint8_t>((before >> 8) & 0xff);
buf[2] = static_cast<uint8_t>((before >> 16) & 0xff);
buf[3] = static_cast<uint8_t>((before >> 24) & 0xff);

// Add buf to your UDP packet and send it
// Stuff...
// After receiving the packet on the other end:

int32_t after = 0;
after += buf[0] << 0;
after += buf[1] << 8;
after += buf[2] << 16;
after += buf[3] << 24;

std::cout << before << ", " << after << std::endl;

Ваша проблема (на мой взгляд) состоит в том, что вы хотите хранить 32-битные числа в 8-битных буферах, которые вам нужны для пакетов UDP.Для этого нужно выделить большее число, преобразовать его в отдельные байты, передать эти байты, а затем снова собрать большое число из байтов.

Приведенный выше код должен позволить вам сделать это,Обратите внимание, что я изменил типы на int32_t и uint8_t, чтобы убедиться, что я знаю точный размер моих типов - в зависимости от используемой вами библиотеки, вам, возможно, придется использовать простые типы int и char, простопомните, что тогда точные размеры ваших типов не гарантируются (скорее всего, они все равно будут 32 и 8 бит, но они могут изменить размер, если вы измените компилятор или скомпилируете для другой целевой системы).Если вы хотите, вы можете добавить sizeof проверок, чтобы ваши типы соответствовали вашим ожиданиям.

1 голос
/ 26 сентября 2019

Я не уверен, что ты пытаешься сделать!Вы должны сказать свою цель.

Символ (обычно 8-битный) в c ++ не содержит int (обычно 32-битный). Если вы хотите сохранить int, вы должны использовать массив int:

int buf[1500];

memset (buf, '' + i, 1450);на самом деле запишет сумму числа '' ascii плюс i всегда в начале буфера (адрес буфера никогда не увеличивается).

что-то вроде этого, возможно, это то, что вы хотите:

int buf[1500] = 0;
for (int i = 0; i < 1449; i++)
{
    buf[i] = i;
    cout << buf[i] << ' ';
}

рассмотрите возможность использования контейнеров c ++ 11, таких как std :: vector, для хранения int или chars, было бы гораздо безопаснее использовать.

...