2016-03-10 2 views
2

Je dois imprimer sur la sortie standard quelques valeurs std::uint16_t comme hexadécimal avec le formatage de texte suivant: 0x##. J'ai trouvé ce code en ligne qui fonctionne très bien pour chaque valeur, sauf 0:std :: cout de l'hexadécimal 0x00

std::cout << std::internal 
      << std::setfill('0') 
      << std::hex 
      << std::showbase 
      << std::setw(4) 
      << value << std::endl; 

Pour une raison que je ne comprends pas, 0 est imprimé comme 0000. Toutes les autres valeurs sont correctement imprimées comme prévu.

+5

Comme on le voit dans la ([section Notes ici] http://en.cppreference.com/w/cpp/io/manip/showbase #Notes), c'était un choix délibéré. Comment le contourner? Pas sûr, j'en ai peur, je n'en ai jamais eu besoin. Il semble que vous deviez créer votre propre ['num_put'] (http://en.cppreference.com/w/cpp/locale/num_put), ce qui est pénible pour les proverbiaux. – BoBTFish

+0

_Une question par question s'il vous plaît._ –

+3

Je suis assez sûr qu'un programmeur a conçu ce système ("Le zéro est le même dans chaque base, quel est le problème?"). Je pense que ... << "0x" << setw (2) << ... 'devrait fonctionner. – molbdnilo

Répondre

1

Pour votre question supplémentaire. Vous devez uniquement redéfinir la largeur. Le reste des manipulateurs sont persistants.

std::cout << std::internal 
     << std::setfill('0') 
     << std::hex 
     << std::showbase ; 

for(std::uint16_t i =1;i<255;++i){ 
     std::cout<< std::setw(4)<<i<<"\n"; 
} 

Pour remédier à la question setw voici quelques solutions de contournement: “Permanent” std::setw