Как преобразовать символ* в короткое целое без знака в C++

У меня есть a char* name который является строковым представлением короткого, я хочу, такой как "15" и должен произвести это как unsigned short unitId к двоичному файлу. Этот бросок должен также быть межплатформенный совместимый.

Это корректный бросок: unitId = unsigned short(temp);

Обратите внимание на то, что я на уровне новичка в понимании двоичного файла.

8
задан Elpezmuerto 23 June 2010 в 15:33
поделиться

6 ответов

Я предполагаю, что ваше char* name содержит string представление короткого числа, которое вы хотите, т.е. "15".

Не не приводите char* непосредственно к типу, не являющемуся указателем. Приведение в Си фактически не изменяет данные (за некоторыми исключениями) - оно просто сообщает компилятору, что вы хотите преобразовать один тип в другой. Если вы приведете char* к unsigned short, вы возьмете значение указателя (которое не имеет ничего общего с содержимым), отрежете все, что не помещается в short, а остальное выбросите. Это совершенно не то, что вам нужно.

Вместо этого используйте функцию std::strtoul которая анализирует строку и возвращает вам эквивалентное число:

unsigned short number = (unsigned short) strtoul(name, NULL, 0);

(Вам все еще нужно использовать приведение, потому что strtoul возвращает unsigned long. Однако это приведение выполняется между двумя различными целочисленными типами, поэтому оно корректно. Худшее, что может случиться, это то, что число внутри name слишком велико, чтобы поместиться в short - ситуация, которую можно проверить в другом месте.)

.
17
ответ дан 5 December 2019 в 05:07
поделиться

Является ли указатель имя идентификатором или строкой символов, на которую указывает имя ? То есть, если имя содержит «1234» , нужно ли вывести 1234 в файл? Я предполагаю, что это так, поскольку другой случай, который вы бы сделали с unitId = unsigned short (name) , определенно неверен.

Тогда вам нужна функция strtoul () .

char * endp
unitId = (unsigned short)strtoul(name, &endp, 0);
if (endp == name) {
     /* The conversion failed. The string pointed to by name does not look like a number. */
}

Будьте осторожны при записи двоичных значений в файл; результат выполнения очевидной вещи может работать сейчас, но, скорее всего, не будет переносимым.

0
ответ дан 5 December 2019 в 05:07
поделиться

что приведение даст вам (усеченную) целочисленную версию указателя, предполагая, что temp также является char*. Это почти наверняка не то, что вам нужно (и синтаксис тоже неправильный). Посмотрите на функцию atoi, возможно, это то, что вам нужно, например, unitId = (unsigned short)(atoi(temp)); Обратите внимание, что здесь предполагается, что (a) temp указывает на строку цифр и (b) цифры представляют собой число, которое может поместиться в unsigned short

2
ответ дан 5 December 2019 в 05:07
поделиться

Для преобразования строки в двоичный формат в C++ можно использовать stringstream.

#include <sstream>

. . .

int somefunction()
{
    unsigned short num;
    char *name = "123";
    std::stringstream ss(name);

    ss >> num;

    if (ss.fail() == false)
    {
        // You can write out the binary value of num.  Since you mention
        // cross platform in your question, be sure to enforce a byte order.
    }
}
6
ответ дан 5 December 2019 в 05:07
поделиться
#include <boost/lexical_cast.hpp>

unitId = boost::lexical_cast<unsigned short>(temp);
9
ответ дан 5 December 2019 в 05:07
поделиться

Если у вас есть строковое (char * в C) представление числа, вы должны использовать соответствующую функцию для преобразования этой строки в числовое значение, которое оно представляет.

Для этого есть несколько функций. Они задокументированы здесь: http://www.cplusplus.com/reference/clibrary/cstdlib

0
ответ дан 5 December 2019 в 05:07
поделиться