atoi ungültige Umwandlung von »char« in »const char*«



  • Weil Zahlen in der Regel aus mehreren Ziffern bestehen. Würde atoi() nur ein char, und kein char-Pointer erwarten, so könnte es ja nur einzelne Ziffern umwandeln. Und dazu braucht man die Funktion nicht einmal. Übrigens ist atoi() kein C++, sondern C.


  • Administrator

    Athar schrieb:

    Dann braucht man keine Funktion, sondern kann gleich -'0' rechnen.

    Problem hast du nur, dass vom Standard her nicht garantiert ist, dass die Zeichen 0 bis 9 hintereinander liegen oder in welcher Reihenfolge sie im Zeichensatz sind. Daher brauchst du immer noch eine Funktion, damit jede Plattform unterstützt werden kann, auch wenn diese dann nur ein - '0' macht. Nie auf eigene Faust - '0' durchführen, sowas kann böse enden.

    Grüssli



  • Dravere schrieb:

    Athar schrieb:

    Dann braucht man keine Funktion, sondern kann gleich -'0' rechnen.

    Problem hast du nur, dass vom Standard her nicht garantiert ist, dass die Zeichen 0 bis 9 hintereinander liegen oder in welcher Reihenfolge sie im Zeichensatz sind. Daher brauchst du immer noch eine Funktion, damit jede Plattform unterstützt werden kann, auch wenn diese dann nur ein - '0' macht. Nie auf eigene Faust - '0' durchführen, sowas kann böse enden.

    Doch, ist es. - '0' ist vollkommen in Ordnung.


  • Administrator

    Janjan schrieb:

    Doch, ist es. - '0' ist vollkommen in Ordnung.

    Beweis es. Der Standard schreibt allerdings keinen Zeichensatz vor, wie du dies daher machen willst, darauf bin ich sehr gespannt 🙂

    Grüssli



  • Both the basic source and basic execution character sets shall have
    at least the following members:
    ...
    the 10 decimal digits
    0 1 2 3 4 5 6 7 8 9
    ...
    In both the source and execution
    basic character sets, the value of each character after 0 in the above
    list of decimal digits shall be one greater than the value of the
    previous.

    Der Standard schreibt zwar keinen genauen Zeichensatz vor, jedoch werden gewisse Anforderungen an den Zeichensatz vorgeschrieben.



  • Was der Standard sagt, dürfte in diesem Fall ohnehin egal sein.
    Eine Programmiersprache ist praxisbezogen.



  • manni66 schrieb:

    Manchmal hilft es, vor dem Denken den Verstand einzuschalten:
    ...

    manni66 schrieb:

    Dann denk mal nach. Und wie gesagt, Verstand einschalten hilft.

    Auf die dahinter liegende Abschätzigkeit wurde schon eingegangen ... interessant finde ich noch die Unreflektiert- und Unwissenheit, die aus diesem Beitrag sprechen (und die ich nicht selten im Internet finde):
    Was soll "Verstand" (also z.B. Transfer und Verknüpfung bereits vorhandenen Wissens) bei einem bislang vollkommen unbekannten Themengebiet bringen?
    Kommt man mit "Verstand" darauf, was wie Baseball funktioniert? Weiß ein Mathematikprofessor automatisch, welche Kraftstoffart ein bestimmtes Automodell braucht?

    Aber vielleicht sollte ich auch keine Trolle füttern...

    Gruß,

    Simon2.



  • Wikipedia sagt zu Verstand etwas anderes.



  • knivil schrieb:

    Wikipedia sagt zu Verstand etwas anderes.

    😕
    "Anders" als was?



  • Tade schrieb:

    Hmm ok. so geht es:

    #include <iostream>
    
    int main()
    {
            char arr[3];
            arr[0] = '3';
            arr[1] = '2';
            arr[2] = '1';
    
            char tmp;
            tmp = atoi(arr);
    }
    

    was mir jetzt aber nicht ganz so klar ist warum atoi() einen zeiger auf character erwartet und nicht einen einzelnen char über atoi(*arr)...

    Das es bei dem Code nicht knallt, ist auch reine Glückssache.
    wie bereits gesagt wurde, muss das letzte zeichen in dem String das Nullterminierungszeichen sein ('\0'). Sollte der Code funktionieren, liegt es daran, dass zufällig hinter dem array arr eine 0 im Speicher steht.

    Zu deiner Frage: Atoi erwartet einen Zeiger auf ein einzelnes zeichen (den Anfangsbuchstaben eines strings) und kann durch Inkrementieren der Adresse weitere Zeichen des Strings einlesen. Das macht die Funktion solange, bis die Funktion das Nullterminierungszeichen findet. Daher muss der String mit einer 0 enden. Hier noch ein richtiger Code:

    char arr[4];
            arr[0] = '3';
            arr[1] = '2';
            arr[2] = '1';
            arr[3] = '\0';
    
            int tmp; // Hier nehme ich int, falls die Werte größer sind
            tmp = atoi(arr);
    

    MfG, Jochen



  • Jochen S. schrieb:

    ...Sollte der Code funktionieren, liegt es daran, dass zufällig hinter dem array arr eine 0 im Speicher steht....

    Wenn ich mich nicht täusche, reicht ein "non-digit" - insofern ist die Chance deutlich größer (theoretisch 246/256 = 96% pro Folgebyte ?) 😉
    Das ändert aber nichts daran, dass das ein Programmierfehler ist und man sowas tunlichst vermeiden sollte...

    Gruß,

    Simon2.


Anmelden zum Antworten