Zahlen einlesen - finde Fehler nicht
-
Warum siehst du dir immer nur das Endergebnis an? Nutze den Debugger! Breakpoints setzen, schrittweise durchgehen, Variableninhalte überprüfen, Debug-Ausgaben notieren usw. Nur so kann man ein Programm sinnvoll debuggen.
Falls du das Visual Studio nutzt, könnte dieser Artikel interessant für dich sein: http://magazin.c-plusplus.net/artikel/Debuggen mit VCPlusPlus6
-
verwende code::blocks und normalerweise kein c/c++
hab wenig ahnung vom debugger dort,Bin aber auf etwas gestoßen:
nt getNumber(FILE* fp) { char num[1024]; char temp[1]; temp[0] = fgetc(fp); if( isNum(temp[0]) == 0) { printf("Falsches Dateiformat oder beschädigte Datei\n"); fclose(fp); return -1; } else { strcat(num, temp); } /** DEBUG **/ printf("%s\n", num); while( 1 == 1) { temp[0] = fgetc(fp); if( isNum( temp[0] != 0)) { strcat(num, temp); /** DEBUG **/ printf("%s\n", num); }
nochmal der selbe code von vorhin, nur dass ich mir stets den string ausgeben lasse:
Ausgabe:
ℓ_2ℓ_2
weiß einer damit etwas anzufangen?
werd gleich mal code::blocks debugger googlen
-
shisha schrieb:
also gut:
Ich habechar* num
durch
char num[1024]
ersetzt, nun spuckt das Programm immer 0 aus.
Damit sollte schonmal mein Segfault verschwinden.
Weiters:
Mach auschar temp[1]
einfach einchar temp
.
Verzichte aufstrcat
, das ist für jeweils ein einziges Zeichen echt nicht nötig. (Ausserdem hatstrcat
gerne Nullbytes am Ende!)werd gleich mal code::blocks debugger googlen
Nicht nötig. Einfach mal Debug -- Step into versuchen, da wird schnell alles klar.
-
Ach ja: das vorgeschlagene
static
fürnum
war natürlich nicht nötig, mea culpa.
-
if( isNum( temp[0] != 0))
Klammern verwirrt? Das gibt so wenig Sinn, weil's nie wahr wird.
-
OK dank des debuggers hab ich nun die stelle wo es hängt:
wie ichs irgendwie schon erwartet hab:
while( 1 == 1) { temp[0] = fgetc(fp); if( isNum( temp[0] != 0)) { strcat(num, temp); /** DEBUG **/ printf("%s\n", num); }
bei dem strcat aufruf hier bekomme ich einen segmentation fault, wieso ist mir unklar aber das wist ihr bestimmt
die klammern hab ich ausgebessert
-
bei dem strcat aufruf hier bekomme ich einen segmentation fault, wieso ist mir unklar aber das wist ihr bestimmt
man: strcat geht bis zum nächsten Nullbyte. Es kann aber keines mehr kommen, weil in temp nur ein Zeichen Platz hat. (siehe oben)
Da ist es ohnehin schon nett von deinem Betriebsystem, dass das Ding nicht anfängt, über den Speicher zu tanzen...
-
die klammern hab ich ausgebessert
Ein
!= 0
kannst du übrigens in einer Bedingung prinzipiell einfach weglassen (warum wohl?). In dem Fall wäre das auch klarer:if (isNum(x)) ...
Analog kannst du stattif (x == 0)
natürlich auch sagenif (!x)
. Das wird dir in C oft begegnen.Nachtrag:
Ich will mal nicht so sein; stattstrcat
würde ich in Zeile 26 sagen:num[strlen(nam)] = temp[0];
Wobei es natürlich auch nicht nötig wäre, jedes mal
strlen
aufzurufen, weil man die momentane Länge auch einfach mitzählen könnte. Nur auch nicht vergessen,num
am Ende mit einem Nullbyte zu terminieren, damit das Ende von printf & Co. erkannt werden kann. Da zeigt sich dann auch, dasstemp
nicht ein Array, sondern ein einzelnes Zeichen sein sollte.^^Na gut, ich bin ohnehin schon pedantisch: man könnte auf
temp
sicher auch ganz verzichten, indem man gleich nachnum
schreibt.
-
Leute ich hab die Nase voll von dieser Funktion und umgehe das ganze:
fscanf(fp, "%d", &int_x)
sollte doch keine nachteile mit sich bringen?
Um evt falsche Formatierung zu erkennen vergleiche ich dann das nächste eingelesene Zeichen einfach mit whitesspace und schon weiß ich was sache ist
Seht ihr darin irgendwelchen neu auftauchenden schwierigkeiten?
neuer code:
if( fscanf(fp, "%d", &w) == 0) { printf("Konnte w nicht ermitteln\nDatei eventuell beschädigt"); fclose(fp); return -1; } if(isspace(fgetc(fp)) == 0) { printf("Illegale Sequenz\n"); printf("Datei eventuell beschädigt\n"); fclose(fp); return -1; }
-
Seht ihr darin irgendwelchen neu auftauchenden schwierigkeiten?
Nein. Aber ich hab Angst vor scanf() und mein Psychiater ist sich noch nicht sicher, ob die begründet ist.