[Anfänger] atoi() ergibt immer 0



  • Hallo, hier mal eine kleine Anfänger-Frage:

    Ich habe mir ein kleines Programm geschrieben, um die Funktion atoi() auszuprobieren:

    #include <stdio.h>
    #include <stdlib.h>
    
    main()
    {
          int ergebnis;
          char eingabe[80];
          gets(eingabe);
          printf(eingabe);
          ergebnis=atoi(eingabe);
          printf("%i",ergebnis);
    }
    

    Das ist jetzt kein kosmetisch schönes Programm, es sollte mir nur zum Ausprobieren dienen. Das Programm erwartet einen String als Eingabe, der wird zur Kontrolle nochmal ausgegeben. Dann soll der String mit atoi in eine Integer Zahl umgewandelt werden. Das Problem ist, dass dabei immer "0" herauskommt.

    Wende ich die Funktion falsch an, habe ich was falsch verstanden oder übersehen oder liegt das am Compiler (Bloodshed Dev C++)?

    Danke im Voraus fürs Antworten

    Firebird1


  • Mod

    Kann den Fehler nicht nachvollziehen, das Programm gibt die Eingabe korrekt einmal als Zeichenkette und einmal als Integer aus:
    http://ideone.com/4KWpdj

    An anderer Stelle begehst du aber zwei absolute Todsünden, die du dir sofort abgewöhnen musst:

    Benutze niemals gets! Keine Diskussion. Die Funktion führt keinerlei Größenprüfungen durch. Sie in neueren C-Dialekten deswegen sogar zur Abschaffung vorgesehen. Eine gute alternative ist fgets.

    Gib niemals eine Benutzereingabe direkt mit printf aus! printf erwartet einen Formatstring zur Steuerung der Ausgabeform. Was ist, wenn der Benutzer hier einen Formatstring eingegeben hätte, der tatsächlich etwas tut? Dann hätte er die Steuerung von printf übernommen und alle möglichen Interna deines Programms ausgeben können. Benutze beispielsweise puts oder benutze printf wie vorgesehen mit einem Formatstring von dir (hier also "%s") und der Nutzereingabe als normalen Parameter.

    Wenn dir irgendjemand gets und/oder printf in dieser Form beigebracht hat, solltest du dringend von diesem Lehrer Abstand nehmen.



  • Vielen Dank für die Tipps,

    dann scheint das Problem anscheinend doch am Compiler zu liegen.

    Kannst Du mir andere kostenlose Compiler als den Bloodshed Dev C++ empfehlen?

    Firebird1



  • Firebird1 schrieb:

    Das Problem ist, dass dabei immer "0" herauskommt.

    Der String schon, oder erst die Integer-Variable?



  • covfefe schrieb:

    Firebird1 schrieb:

    Das Problem ist, dass dabei immer "0" herauskommt.

    Der String schon, oder erst die Integer-Variable?

    Eerst bei der Integer Variable. Der String wird korrekt wiedergegeben.

    Firebird1


  • Mod

    Dev C++ ist kein Compiler, sondern eine Entwicklungsumgebung. Die wird seit ewigen Zeiten nicht mehr weiterentwickelt, wobei es aber eine inoffizielle Fortführung des Projektes gibt.

    Wenn du die letzte offizielle Version von Dev C++ hast, benutzt diese standardmäßig intern eine hoffnungslos veraltete Portierung des populären Compilers GCC. Wenn du die inoffizielle Fortführung benutzt, ist eine Version des GCC dabei, die immerhin "nur" etwas über ein halbes Jahrzehnt alt ist.

    Am Compiler liegt dein Problem aber fast garantiert nicht. atoi ist gewiss korrekt implementiert. Du machst höchstwahrscheinlich irgendetwas anderes falsch, z.B. eine Fehlbedienung deiner IDE, so dass das Programm, welches du ausführst, vielleicht gar nicht zum aktuellen Code gehört.

    Allgemein ist der GCC ein sehr empfehlenswerter Compiler für C. Er richtet sich hauptsächlich an linuxartige Systeme, aber es gibt mit mingw-w64 auch eine aktuelle Portierung für Linux. Dev C++ setzt eine alte 32-Bit Version von MingW ein, deshalb ist sein GCC derart veraltet.

    Ein anderer populärer Compiler für Windows ist die Compilersammlung von Microsoft (Teil der populären und empfehlenswerten Entwicklungsumgebung Visual Studio), der aber C eher stiefmütterlich behandelt und daher bloß den ursprünglichen Sprachstandard von 1989 voll unterstützt.

    Das sind die beiden weitverbreitetsten, aber du würdest sicherlich mit jedem anderen Compiler ebenfalls glücklich werden. Achte darauf, dass sie aktuell noch weiter entwickelt werden und du nicht bei einem Compiler von 2003 landest. eine halbwegs brauchbare IDE sollte dir erlauben, jeden beliebigen Compiler einzusetzen.

    Oder du lässt vielleicht erst einmal IDEs ganz weg und machst alles mit Editor und Kommandozeile, bis du alles etwas besser verstehst. Denn wie gesagt ist mein Tipp, dass du irgendetwas falsch bedient hast.



  • SeppJ schrieb:

    Allgemein ist der GCC ein sehr empfehlenswerter Compiler für C. Er richtet sich hauptsächlich an linuxartige Systeme, aber es gibt mit mingw-w64 auch eine aktuelle Portierung für Linux.

    Ich denke das ist ein Typo statt Linux sollte es wohl Windows heißen 🙂



  • Firebird1 schrieb:

    covfefe schrieb:

    Firebird1 schrieb:

    Das Problem ist, dass dabei immer "0" herauskommt.

    Der String schon, oder erst die Integer-Variable?

    Eerst bei der Integer Variable. Der String wird korrekt wiedergegeben.

    Firebird1

    Dann man debuggen, also im Einzelschritt durchsteppen und Variableninhalt ansehen(Breakpoint bei Zeile 10).



  • Auch lustig:

    Wenn man "normale" Zahlen eingibt (1,3,7) werden die unverändert wieder rausgegeben. (Also ohne Fehlerwert 0) Und ich habe die gleiche Software (Bloodshed Dev C++ ) auf einem älteren Rechner (Win XP) laufen und da funktionierts...
    Beim jetzigen Rechner (Win 7) nicht...


  • Mod

    Firebird1 schrieb:

    Wenn man "normale" Zahlen eingibt (1,3,7) werden die unverändert wieder rausgegeben. (Also ohne Fehlerwert 0) Und ich habe die gleiche Software (Bloodshed Dev C++ ) auf einem älteren Rechner (Win XP) laufen und da funktionierts...

    Wie "normale Zahlen"? Was hast du denn sonst eingegeben anstatt normalen Zahlen? Aus einer Eingabe wie "fünfundzwanzig" macht atoi kein 25, sondern den Fehlerwert 0.



  • Firebird1 schrieb:

    Auch lustig:

    Wenn man "normale" Zahlen eingibt (1,3,7) werden die unverändert wieder rausgegeben. (Also ohne Fehlerwert 0) Und ich habe die gleiche Software (Bloodshed Dev C++ ) auf einem älteren Rechner (Win XP) laufen und da funktionierts...
    Beim jetzigen Rechner (Win 7) nicht...

    Was sind "unnormale" Zahlen?



  • Wie der Titel schon sagt, ich bin bescheuert.

    Ich bin jetzt davon ausgegangen, dass atoi den String "g" ´zum Beispiel in den Wert 103 passend zur ASCII-Tabelle umwandelt. Tatsächlich ist es aber einfach so, dass zum Beispiel der String "123" in Integer 123 umgewandelt wird...

    Das kommt davon, wenn man a) die ganze Zeit in andern Sprachen programmiert hat
    und b) keinen Morgenkaffee hatte...

    Wie gesagt, ich bin bescheuert, hab euch davor aber schon im Titel der Frage gewarnt...

    Ich geh mich jetzt erst mal in der Ecke schämen und danke euch allen erstmal für eure Geduld...

    Firebird1



  • SeppJ schrieb:

    Aus einer Eingabe wie "fünfundzwanzig" macht atoi kein 25, sondern den Fehlerwert 0.

    Den man von einer korrekten "0" nicht unterscheiden kann.

    Darum empfiehlt sich stattdessen strtol .



  • Firrebird1 schrieb:

    Ich bin jetzt davon ausgegangen, dass atoi den String "g" ´zum Beispiel in den Wert 103 passend zur ASCII-Tabelle umwandelt.

    Weißt du denn jetzt, wie man das macht?



  • DirkB schrieb:

    Weißt du denn jetzt, wie man das macht?

    Man könnte das doch durch einen TypeCast (so nennt sich das glaub ich) erreichen.

    Das sähe dann doch so aus, oder:

    char c='A';
    int i=(int)c;
    

  • Mod

    Hast du mal versucht, was ohne den Cast passiert?



  • SeppJ schrieb:

    Hast du mal versucht, was ohne den Cast passiert?

    ... Der gleiche Fehler, den ich vorher hatte? Oder worauf willst du hinaus?


  • Mod

    Firebird1 schrieb:

    SeppJ schrieb:

    Hast du mal versucht, was ohne den Cast passiert?

    ... Der gleiche Fehler, den ich vorher hatte? Oder worauf willst du hinaus?

    Also hast du es nicht versucht.



  • SeppJ schrieb:

    Firebird1 schrieb:

    SeppJ schrieb:

    Hast du mal versucht, was ohne den Cast passiert?

    ... Der gleiche Fehler, den ich vorher hatte? Oder worauf willst du hinaus?

    Also hast du es nicht versucht.

    #include <stdio.h>
    
    main()
    {
     	  int i;
     	  char c="g";
     	  i=c;
     	  printf("%i",i);
    }
    

    Nun, doch, dann bekomme ich wieder das Ergebnis 0. Das Fragezeichen richtete sich eher danach, ob Du darauf hinaus wolltest oder etwas anderes als Ergebnis geschehen sollte...



  • char c='g'; // kein string, sondern ein Zeichen (beachte ')
    

Anmelden zum Antworten