2013-09-15 4 views
2

Итак, строка имеет тип значения char. Я хочу строку типа значения unsigned char. Почему я хочу такое, потому что в настоящее время я пишу программу, которая преобразует большой ввод шестнадцатеричного в десятичный, и я использую строки для вычисления результата. Но диапазон char, который от -128 до 127 слишком мал, неподписанный символ с диапазоном от 0 до 255 будет работать отлично. Рассмотрим этот код:basic_string of unsigned char Значение Тип

#include<iostream> 
using namespace std; 

int main() 
{ 
    typedef basic_string<unsigned char> u_string; 
    u_string x= "Hello!"; 

    return 0; 
} 

Но когда я пытаюсь скомпилировать, он показывает 2 ошибки, одна _invalid преобразование сопзЬ полукокса * беззнаковое сопзЬ полукокса * _ и другой инициализирует аргумент 1 из станд: : basic_string < _CharT, _Traits, _Alloc> :: basic_string ... (это продолжается)

EDIT: «Почему проблема "преобразует большой вклад в шестнадцатеричной в десятичную" требуют инициализации u_string с строкового литерала ?» При вычислении каждый раз, когда i сдвигается влево от шестнадцатеричного числа, i умножается на 16. В лучшем случае результат будет равен 16x9 = 144, что превышает предел 127, и это делает его отрицательным. Кроме того, я должен инициализировать его следующим образом:

x = "0"; x [0] - = '0';

Потому что я хочу, чтобы оно имело значение 0. если переменная имеет значение null, то я не могу выполнять на ней операции, если она равна 0, то я могу.

Итак, что мне делать?

+0

Почему проблема "преобразует большой вклад в шестнадцатеричной в десятичную" требуют инициализации 'u_string' с строковым литералом? –

+0

@ Robᵩ см. Мое редактирование пожалуйста. – user2653125

+0

@ user2653125 Ваше редактирование по-прежнему не объясняет, зачем вам нужен строковый литерал * для инициализации. – Angew

ответ

3

Строковые литералы: const char, и вы назначаете их const unsigned char.

Два решения у вас есть:

Во-первых, копирование строки из стандартных строк в вашем поэлементно.

Во-вторых, написать свой собственный user-literal для струнного класса:

inline constexpr const unsigned char * operator"" _us(const char *s,unsigned int) 
{ 
    return (const unsigned char *) s; 
} 

// OR 

u_string operator"" _us(const char *s, unsigned int len) 
{ 
    return u_string(s, s+len); 
} 

u_string x = "Hello!"_us; 
+0

ok, как заставить их считаться const unsigned char по умолчанию? – user2653125

+0

Вы не можете, но у вас могут быть ваши литералы. – deepmax

1

Альтернативным решением было бы сделать ваш компилятор лечить char, как без знака. Есть флаги компилятора для этого:

  • MSVC: /J
  • GCC, Clang, ICC: -funsigned-char
+1

Я хотел бы сделать это в коде, потому что мне нужно загрузить код в качестве решения на онлайн-сайте. – user2653125

Смежные вопросы