char mit int variable vergleichen



  • ok, hab folgendes nuub problem:

    ich möchte eine char variable mit einer int variable vergleichen; beide variablen werden vorher eingelesen. hier ein beispielcode:

    #include <iostream>
    using namespace std;
    
    int main(){
    
        int a;
        char b;
    
        cin >> a;
        cin >> b;
    
        cout << a << endl;
        cout << b << endl;
    
        if(a==b)
          cout << "true" << endl;       
        else
          cout << "false" << endl;
    
        return 0;
    
    }
    

    wie muss ich die char var konvertieren, um sie mit der int vergleichen zu können? möchte keine dritte variable nehmen und darf auch keine externen bibliotheken verwenden (ausser iostream;)
    sorry, ich weiss ein häufiges problem, aber ich konnte keine konkrete antwort für mein beispiel finden ...

    Lg, pete



  • Wenn der Wert der Integervariable im Wertbereich eines char liegt kannst du beide Variablen genau so Vergleichen wie du das bereits tust.



  • dachte ich auch, aber wenn ich für beide vars z.b. 4 eingebe kommt trotzdem "false" ... wenn ich allerdings für a 52 eingebe und für b 4 --> "true" ...
    ASCII Code nehm ich mal an! hat das was mit dem kompilieren zu tun?

    bin ratlos ...



  • Nein, das ist vollkommen korrekt. Alles was du umwandeln musst ist das eingegebene Zeichen in die entsprechende Zahl.

    grüße



  • ok und wie mache ich das?
    theoretisch ginge ja
    b=b-48; (da b einstellig ist)
    is aber nicht besonders elegant, oder?
    gibts andere möglichkeiten?



  • pete t. schrieb:

    dachte ich auch, aber wenn ich für beide vars z.b. 4 eingebe kommt trotzdem "false" ...

    Glaube ich nicht ! 😉
    Es könnte aber sein, daß Du für b (char-Variable) nicht 4, sondern '4' eingegeben hast ... und das entspricht (bei ASCII-Codepage) dem numerischen Wert von 52.

    Was Du willst, ist vermutlich

    std::string b;
    
    std::cin >> b;
    if(a == atoi(b)) {
    ...
    

    Ein Vorteil ist, dass das dann auch bei mehstellgen Zahlen funktioniert; ein weiterer, dass es plattformunabhängig ist (also auch auf Maschinen mit anderen Zeichensätzen funktioniert).

    Wenn es wirklich nur um einstellige geht, kannst Du auch selbst "mappen":

    // C-Variante
    int char2IntMap[256];
    
    void initChar2IntMap() {
        for(int i=0; i<256; ++i) char2IntMap[i] = -1;
        char2IntMap['0'] = 0;
        char2IntMap['1'] = 1;
        char2IntMap['2'] = 2;
        char2IntMap['3'] = 3;
        char2IntMap['4'] = 4;
        char2IntMap['5'] = 5;
        char2IntMap['6'] = 6;
        char2IntMap['7'] = 7;
        char2IntMap['8'] = 8;
        char2IntMap['9'] = 9;
    }
    
    ...
        if(-1 == char2IntMap[b]) throw std::runtime_error("ungültige Eingabe");
        if(a == char2IntMap[b]) ...
    ...
    

    (Kann man auch mit std::map und natürlich variabler Char-Bereich/WChar, ... machen - geht mir nur darum, das Prinzip zu zeigen)

    Gruß,

    Simon2.



  • So:

    c -= '0';
    


  • David_pb schrieb:

    So:

    c -= '0';
    

    Ist zwar schon "ein wenig portabler", aber läuft immer noch Gefahr, auf einem exotischen Codesatz baden zu gehen (bei EBCDIC z.B. ist das Alphabet nicht kontinuierlich auf den Zahlenbereich verteilt ... das warnt mich, dass es bestimmt irgendeinen kruden Satz gibt, bei dem es auf bei Ziffern so ist 😉 ).

    Gruß,

    Simon2.



  • ASCII Code nehm ich mal an!

    vollkommen richtig!
    wenn man den charakter 4 in int castet erhält man 52 (dezimaler Ascii-Wert),
    also kann nie und nimmer "true" rauskommen, wenn du jeweils 4 eingibst.

    (int)char
    int(char)


Log in to reply