atoi() und char str[]



  • Hallo zusammen,

    vielleicht kann mir jemand eine Erklärung geben.
    Bin in Sachen C++ noch Anfänger.

    Ich verstehe folgendes nicht, ich bin dabei, gerade eine Aufgabe aus einem C++ Buch zu lösen. Eine funktionierende Lösung sieht so aus:

    void Loesung1()
    {
    	int Ergebnis = 0;
    	char sA, sB, sC, sD;
    
    	cout << "Bitte geben Sie eine 4stellige Zahl ein: ";
    	sA = _getch(); cout << sA;
    	sB = _getch(); cout << sB;
    	sC = _getch(); cout << sC;
    	sD = _getch(); cout << sD << endl;
    
    	Ergebnis = atoi(&sA) + atoi(&sB) + atoi(&sC) + atoi(&sD);
    
    	cout << "Die Quersumme von " << sA << sB << sC << sD << " lautet: " << Ergebnis << endl;
    }
    

    Nun habe ich eine 2. Funktion mit einer 2. möglichen Lösung geschrieben, da ich nicht 4 char variablen verwenden möchte:

    void Loesung2()
    {
    	int Ergebnis = 0;
    	char str[5];
    
    	cout << "Bitte geben Sie eine 4stellige Zahl ein: ";
    	cin >> str;
    
    	Ergebnis = atoi(&str[0]) + atoi(&str[1]) + atoi(&str[2]) + atoi(&str[3]);
    
    	cout << "Die Quersumme von " << str << " lautet: " << Ergebnis << endl;
    }
    

    Meine Frage dazu ist nun, warum wird in der 2. Lösung nicht der Wert des typs char an die Funktion atoi() geliefert, sondern deren Ascii-Wert und wie kann ich das verhindern, oder wie verwandle ich innerhalb des atoi()-Aufrufs den Ascii-Wert in den eingegebenen Wert?

    Im ersten Beispiel wird ja auch der Wert selbst und nicht der Ascii-Wert übergeben. Was mache ich falsch?

    Ich hoffe Ihr versteht mein Problem 🙂

    Edit: Sorry für falsches Forum. Wenn schon keiner auf meine Frage antwortet, kann wenigstens jemand den Thread ins C++ Forum verschieben. Danke 😉

    Viele Grüße
    Zalkortis



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • atoi() geht im String bis zum ersten Nullbyte, und vom Anfang bis dort hin wird die
    Zahl angenommen. ZB:

    char *str = "1234";
    
    // dann ergibt ein Aufruf von atoi()
    atoi(str);      // => 1234 als Ganzahl
    
    // den Ziffern-Wert der ersten Stelle kannst du im ASCII-Satz ganz einfach ermitteln:
    str[0] - '0';   // => 1 als Ganzzahl
    str[2] - '0';   // => 3 als Ganzzahl
    

    Auf atoi() würde ich in dem Fall ganz verzichten.

    (Daraus folgt auch, daß deine beiden Varianten nicht "funktionieren", es könnte in der
    ersten ja nach einer der char-Variablen im Speicher noch eine Ziffer sein.)



  • Danke für Deine Antwort 🙂

    Ich habe nun mal das folgende probiert:

    Ergebnis = str[0] + str[1] + str[2] + str[3];
    

    allerdings kommt dann bei "1234" als Ergebis anstatt 10 die Zahl 202.
    Warum Lösung 1 funktioiert und Lösung 2 nicht, habe ich bisher nicht ganz verstanden.

    Gruß
    Zalkortis



  • allerdings kommt dann bei "1234" als Ergebis anstatt 10 die Zahl 202.

    Ganz richtig.

    Die Quersumme wäre 10. Das sind also genau 192 zu viel, und das ist vier mal 48, und
    48 entspricht ganz genau '0' im ASCII-System. Deshalb hatte ich geraten, '0' zu subtrahieren.

    Nochmal:
    Die erste Variante funktioniert auch nicht, und wenn doch, dann nur zufällig, und nicht
    unbedingt. Google mach nach nasal demon.

    atoi() braucht mindestens zwei Zeichen, um in jedem Fall korrekt zu arbeiten:
    ein gültiges Zeichen (oder mehr) und danach ein Nullbyte ('\0' - nicht zu verwechseln mit '0').

    Wenn du weißt, daß ein Zeichen eine Ziffer darstellt, dann bekommt du den Wert der Ziffer
    am einfachsten so, wie ich oben beschrieben habe.


Anmelden zum Antworten