2016-11-27 5 views
3

Я использую манипуляторы в течение некоторого времени, не полностью понимая, как они работают.Почему std :: uppercase не работает со строками?

Этот код:

std::cout << std::hex << std::showbase; 
std::cout << std::uppercase << 77 << '\n'; 
std::cout << std::nouppercase << 77 << '\n'; 

Или же это:

std::cout << std::hex; 
std::cout << std::setiosflags(std::ios::showbase | std::ios::uppercase) << 77 << '\n'; 
std::cout << std::nouppercase << 77 << '\n'; 

Оба выхода этого:

0X4D // 'X' and 'D' uppercase 
0x4d // 'x' and 'd' lowercase 

Однако ни одна из следующих строк кода не может преобразовать строку «абвг "в верхний регистр. Зачем?

std::cout << std::uppercase << "abcd" << '\n'; 
std::cout << std::setiosflags(std::ios::uppercase) << "abcd" << '\n'; 

Другой вопрос, почему showbase и uppercase должны быть квалифицированы с std::ios:: внутри std::setiosflags() и только с std:: вне этой функции?

Финлей, почему std::hex не может быть принят в std::setiosflags()

Спасибо

ответ

6

Прочитать документацию для std::uppercase.

Позволяет использовать символы верхнего регистра в выводе с плавающей точкой и шестнадцатеричным целым числом.

std::ios_base::hex принимается std::setiosflags есть пример в docs.

Вот пример для std::uppercase:

#include <iostream> 
int main() 
{ 
    std::cout << std::hex << std::showbase 
       << "0x2a with uppercase: " << std::uppercase << 0x2a << '\n' 
       << "0x2a with nouppercase: " << std::nouppercase << 0x2a << '\n' 
       << "1e-10 with uppercase: " << std::uppercase << 1e-10 << '\n' 
       << "1e-10 with nouppercase: " << std::nouppercase << 1e-10 << '\n'; 
} 

Вот пример для std::setiosflags:

#include <iostream> 
#include <iomanip> 

int main() 
{ 
    std::cout << std::resetiosflags(std::ios_base::dec) 
       << std::setiosflags( std::ios_base::hex 
            | std::ios_base::uppercase 
            | std::ios_base::showbase) << 42 << '\n'; 
} 

Определения:

std::hex определяется как std::ios_base& hex(std::ios_base& str);

std::ios_base::hex определяется как static constexpr fmtflags hex = /*...*/;

2

std::uppercase влияет только на результат преобразования в шестнадцатеричном.

std::hex - объект манипулятора, а setiosflags ожидает целое число, образованное путем объединения отдельных бит. Точнее, тип ведет себя таким образом. Вместо std::hex (это неправильный тип) вы можете использовать std::ios_base::hex.

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

  • Нет связанных вопросов^_^