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



  • Servus,

    ich habe ein großes Problem mit der atoi() funktion. Ich verstehe nicht warum folgender code:

    #include <iostream>
    
    int main()
    {
            char c = '8';
    
            char tmp;
            tmp = atoi(c);
    }
    

    mit folgender anweisung kracht:

    test.cpp:8: Fehler: ungültige Umwandlung von »char« in »const char*«
    test.cpp:8: Fehler:   Argument 1 von »int atoi(const char*)« wird initialisiert
    

    Wenn ich ein array anlege muss ich z.B. erst einen pointer draufzeigen lassen. Also so gehts nicht:

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

    kommt folgende fehlermelung:

    test.cpp:6: Fehler: ungültige Umwandlung von »char« in »char*«
    test.cpp:7: Fehler: ungültige Umwandlung von »char« in »char*«
    test.cpp:8: Fehler: ungültige Umwandlung von »char« in »char*«
    test.cpp:11: Fehler: »tmp« wurde in diesem Gültigkeitsbereich nicht definiert
    

    Kann mir jemand sagen was das problem ist und wie ich es für beispiel 2 dann beheben könnte? Muss ich wirklich einen temporären pointer auf arr zeigen lassen und dann atoi() mit dem pointer füttern?

    Danke



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

    const char* val = "123";
    
    int i = atoi( val );
    


  • Manchmal hlift es einen Beitrag ganz zu lesen bevor man antwortet. Meine frage war nicht wie es geht sondern warum mein code nicht geht.



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



  • Das erste Beispiel funktioniert nicht, weil atoi einen Zeiger auf char erwartet, du übergibst aber ein char. Noch genauer erwartet atoi einen nullterminierten char-String (d.h. das Ende des Strings wird mit einem Nullbyte signalisiert).

    Das zweite Beispiel funktioniert nicht, weil du ein Array aus char-Zeigern anlegst. Du möchtest aber ein char-Array. Auch hier musst du auf die Nullterminierung achten.



  • ich meinte natürlich dass dieser code nicht geht:

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

    mache ich es aber so geht es:

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

    mir ist nicht klar warum mein char* c constant sein soll? ist es doch gar nicht aber so geht es. Dafür geht mein atoi(*arr) nicht...



  • manni66 schrieb:

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

    Ich weiß nicht, aber um Aggressionen abzuladen gibt es bessere Möglichkeiten. Sport soll ganz gut sein.
    Solche Kommentare, wie du sie hier binnen kurzer Zeit mehrfach abgelassen hast, helfen niemandem, sorgen nur für böses Blut und Frust beim Fragensteller. Wenn die Frage für dich so banal ist, dann sag doch die Lösung. Es gibt Leute, die gerade mit Programmieren anfangen, die durch solche Antworten die Lust am Programmieren verlieren. Erinner dich an deine Anfangstage/Wochen.



  • Ich weiß nicht, aber um Aggressionen abzuladen gibt es bessere Möglichkeiten. Sport soll ganz gut sein.
    Solche Kommentare, wie du sie hier binnen kurzer Zeit mehrfach abgelassen hast, helfen niemandem, sorgen nur für böses Blut und Frust beim Fragensteller. Wenn die Frage für dich so banal ist, dann sag doch die Lösung. Es gibt Leute, die gerade mit Programmieren anfangen, die durch solche Antworten die Lust am Programmieren verlieren. Erinner dich an deine Anfangstage/Wochen.

    danke - genauso ist es nämlich. Ich bin Anfänger. Bezüglich meines letztens posts ist mir das nicht klar...ich wäre froh wenn mir jemand da noch helfen könnte.



  • Tade schrieb:

    ich meinte natürlich dass dieser code nicht geht:

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

    Athar schrieb:

    Das erste Beispiel funktioniert nicht, weil atoi einen Zeiger auf char erwartet, du übergibst aber ein char. Noch genauer erwartet atoi einen nullterminierten char-String (d.h. das Ende des Strings wird mit einem Nullbyte signalisiert).

    manni66 schrieb:

    Manchmal hilft es, vor dem Denken den Verstand einzuschalten:



  • Das erste Beispiel funktioniert nicht, weil atoi einen Zeiger auf char erwartet, du übergibst aber ein char.

    ja danke aber ist denn arr von:
    char arr[3]
    kein pointer auf character? Ich dachte ich lege mit char arr[3] einen Zeiger auf einen Speicherbereich an wo eben character drin liegen? Damit wäre das doch ein Zeiger auf character oder nicht?



  • Du solltest dir noch einmal ein Kapitel über Zeiger anschauen.
    Mit * dereferenzierst du. arr ist implizit in char* konvertierbar, der Zeiger zeigt dann aufs erste Zeichen ('3'), mit *arr bekommst du demnach das erste Zeichen. Wie schon gesagt, erwartet atoi einen nullterminierten char*-String und kein Zeichen.

    Das zweite Beispiel ist ebenfalls falsch, es ist reine Glückssache, wenn dir das nicht um die Ohren fliegt.
    Richtig sieht es so aus:

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

    atoi erwartet ein const char*, damit verspricht es dir lediglich, dass es deinen String nicht verändert. Du kannst atoi trotzdem einen nichtkonstanten String übergeben.



  • 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)...



  • Ok danke euch. Jetzt glaube habe ich es verstanden. Die signatur erwartet es einfach so....und einen string also... danke euch.



  • Wenn man atoi nur ein einzelnes Zeichen geben könnte, dann kann man nicht mehr als eine Ziffer aufs Mal umwandeln. Dann braucht man keine Funktion, sondern kann gleich -'0' rechnen.



  • 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.


Anmelden zum Antworten