[Anfänger] atoi() ergibt immer 0
-
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
-
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...
-
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;
-
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?
-
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.
-
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, wohingehen1
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.