[Anfänger] atoi() ergibt immer 0


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


  • dddrdr schrieb:

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

    Hoppla, das passiert, wenn man nicht aufpasst. Na dann kommt auch das richtige Ergebnis raus.


  • Mod

    Firebird1 schrieb:

    dddrdr schrieb:

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

    Hoppla, das passiert, wenn man nicht aufpasst. Na dann kommt auch das richtige Ergebnis raus.

    Siehste. Denn ein Zeichen ist technisch gesehen auch ein Zahl, es ist also kein Problem, einer Zahl ein Zeichen zuzuweisen. Man kann auch ganz normal mit Zeichen rechnen. Beispielsweise benutzt man gerne den Fakt, dass '0' + 1 == '1' ist, usw. (beachte, dass '1' das Zeichen für die Ziffer Eins ist, wohingehen 1 die Zahl Eins ist).

    Eine Zeichenkette ist aber natürlich kein Zeichen, da geht das nicht.

    PS: Und eine andere Sache, die du daran siehst, dass du es oben versehentlich falsch gemacht hast: C ist ziemlich gnadenlos. Ein falsches Zeichen und ein Programm macht etwas völlig anderes als geplant. Fast alles ist irgendwie gültiges C, daher beschwert sich der Compiler selten. Daher muss man ganz genau aufpassen, immer genau das zu schreiben, was man meint, und nicht etwas, das nur so ähnlich aussieht.



  • SeppJ schrieb:

    Fast alles ist irgendwie gültiges C, daher beschwert sich der Compiler selten.

    Wenn man die Warnungen beim Compiler aktiviert und auch den Warnlevel entsprechend setzt, mosert der Compiler immerhin rum, dass etwas nicht so ganz sauber ist.

    Und diese Warnungen sollte man ernst nehmen.
    D.h deren Ursache beseitigen.


Anmelden zum Antworten