Heim >Backend-Entwicklung >C++ >Warum druckt „cout' bei der Verarbeitung von „unsigned char' unerwartete Zeichen, während „printf' dies nicht tut?

Warum druckt „cout' bei der Verarbeitung von „unsigned char' unerwartete Zeichen, während „printf' dies nicht tut?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-04 10:44:10803Durchsuche

Why Does `cout` Print Unexpected Characters When Handling `unsigned char` While `printf` Doesn't?

Enthüllung des Geheimnisses hinter couts unvorhersehbarem Verhalten mit unsigned char

Beim Programmieren können unerwartete Ausgaben oft zu Frustration und Verwirrung führen. Betrachten Sie den folgenden Code:

#include<iostream>
#include<stdio.h>

using namespace std;

int main() {
    unsigned char a;
    a = 1;
    printf("%d", a);
    cout << a;
}

Dieser Code dient dazu, den in der vorzeichenlosen char-Variablen „a“ gespeicherten Wert auszugeben, der 1 ist. Bei der Ausführung gibt er jedoch „1“ aus, gefolgt von etwas scheinbarem zufällige Zeichen. Warum verhält sich cout in diesem Szenario anders als printf?

Die Antwort liegt in der Natur von unsigned char. ASCII-Zeichen mit den Werten 0 bis 31 gelten als nicht druckbare. Das dem Wert 1 zugewiesene Zeichen ist ein nicht druckbares Zeichen, das ohnehin zu drucken versucht. Um festzustellen, ob ein Zeichen druckbar ist, können Sie die Funktion std::isprint verwenden:

std::cout << std::isprint(a) << std::endl;

Diese Anweisung gibt 0 (falsch) aus, was angibt, dass das Zeichen nicht druckbar ist.

Um dieses Problem zu beheben und cout zu zwingen, den Wert von a als 1 auszugeben, können Sie ihn in eine vorzeichenlose Ganzzahl umwandeln:

cout << static_cast<unsigned>(a) << std::endl;

Diese Umwandlung wandelt das nicht druckbare Zeichen in den entsprechenden vorzeichenlosen Ganzzahlwert um und stellt so sicher, dass cout 1 korrekt ausgibt.

Das obige ist der detaillierte Inhalt vonWarum druckt „cout' bei der Verarbeitung von „unsigned char' unerwartete Zeichen, während „printf' dies nicht tut?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn