Почему массив символов не печатает значение? - PullRequest
0 голосов
/ 30 сентября 2019

Мне нужно прочитать обратно 'id' и 'port' из массива char. Но cout ничего не печатает. Как правильно это сделать?

Спасибо за помощь.

int main() {
    char addr[6];
    int id = 2;
    short port = 1;
    memcpy(&addr[0], &id, sizeof(int));
    memcpy(&addr[4], &port, sizeof(short));

    cout << "addres:" << addr << endl;
    return 0;
}

Ответы [ 2 ]

3 голосов
/ 30 сентября 2019

Поскольку, предполагая, что int является 32-битным на вашей целевой платформе, вы копируете 4 байта (0, 0, 0, 2 или 2, 0, 0, 0, в зависимости от порядкового номера) в адрес, на который указывает addr, и предполагаете, что short - 16-битный,Вы копируете 2 байта (0, 1 или 1, 0, в зависимости от порядкового номера) по адресу, указанному addr+4, в результате чего addr содержит байты 0, 0, 0, 2, 0, 1 или 2, 0, 0, 0, 1, 0.

Строки в стиле C в C ++ заканчиваются 0, поэтому, если первый символ равен 0, addr интерпретируется как пустая строка.

Если первый символ равен 2, вы все равно ничего не увидите,потому что это не печатный символ. (Это управляющий символ STX (начало текста).)

0 голосов
/ 30 сентября 2019

Вы можете напечатать целые значения содержимого addr, чтобы понять, что там.

for (int i = 0; i < 6; ++i )
{
    std::cout << "element " << i << " : " << static_cast<int>(addr[i]) << std::endl;
}

Скорее всего, вы получите:

element 0 : 2
element 1 : 0
element 2 : 0
element 3 : 0
element 4 : 1
element 5 : 0

Это предполагает, что:

  1. sizeof(int) - это 4 на вашей платформе.
  2. sizeof(short) - это 2 на вашей платформе.
  3. В вашей платформе используется система с порядковым порядком байтов для чисел.

Когда вы используете

    cout << "addres:" << addr << endl;

Вы печатаете строку с непечатаемым символом в первом элементе и нулевым символом во втором элементе, т.е. вы печатаете строку с нулевым символом в конце, котораясодержит только непечатаемый символ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...