PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : strcmp lässt programm abstürzen



madcyborg
24.06.2009, 21:17
Ich hab da mal ein Problem aus der Windowswelt, aber letztlich ists eben C, darum denke ich das ich hier nicht soo falsch bin. Oder habe ich ein Unterforum zum Thema Programmiersprachen auf "großen" Rechnern übersehen?


int kopfda(FILE *datei)
{
char zeile[81]; //Pufferzeile
char *zeile_p=zeile; //Zeiger darauf
char sollkopf[15]="R-Netz_08021"; //Sollstring, mit dem Verglichen werden soll
int zurueck=0; //Rückgabewert
zeile_p = fgets(zeile_p, 81, datei); //erste Zeile der Datei lesen
printf(zeile); //besagte Zeile testweise ausgeben
printf(sollkopf); //Sollkopf testweise ausgeben
zurueck = strcmp (sollkopf,zeile); //Vergleich, soll 0 ergeben
printf(zurueck); //zurueck testweise ausgeben
zurueck++; //zureuck von 0 auf 1 setze, 1 wird als erfolg gewertet
return zurueck;
}


Mein Programm stürzt nach "printf(sollkopf);" ab.
Einfach so. Auch wenn ich zb "strcmp("bla","bla");" schreibe.
Irgendwas ist mit strcmp faul. Gibts sowas wie typsiche Anfängerfehler oder so?
Hat jemand eine Idee?
Gebaut habe ich das ganze mit Code::Blocks 8.02 unter Windows XP.

Ceos
25.06.2009, 00:29
fgets fügt am ende kein stringterminal ein, deshalb rennt dein strcmp wohl über die grenze des zeile-array und kackt ab!
stringterminal ist '/0' (null) oder auch einfach nur die zahl 0

dein aaray sollte dann aber auch 82 bytes groß sein wenn du 81 bytes einliesst!

die größe deines "sollkopf" würd ich rausnehmen

sollkopf[] = "balbla"

der compiler ergänzt die stringgröße beim übersetzn von intitialisierten arrays selbst

könnt auch dein printf sein das stirbt, wegen fehlendem stringterminal

meld dich wenn du es gefunden hast, finde zwar, dass das forum hier nicht unbedingt SO das richtige dafür ist, aber iss hier allemal besser als im c-plusplus forum ^^ da wird man nur hochnäsig angeschnauzt ^^

EDIT: dein

zeile_p = fgets ( ...

iss aber auch falsch!!!

fgets liefert dir die anzahl gelesener bytes oder EOF (-1 glaube, End Of File) zurück und keinen pointer!!

madcyborg
25.06.2009, 09:49
Jetzt wirds haarig. Selbst das:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
char eins[]="bla";
char zwei[]="bla";
int ergebnis=0;

printf("Hello world!\n");
ergebnis=strcmp(eins,zwei);
printf(ergebnis);

system("PAUSE");
return 0;
}
stürzt nach dem Hallowelt ab.
Und das ist doch so ziemlich sicher was ich da geschrieben habe?
Ich habs übrigens testhalber auch nochmal in DevCpp compilieren lassen, dessen gcc.exe rund 3 Jahre älter ist. Man weiß ja nie...aber das Ergebniss ist das selbe.

Ich bin damit übrigens deswegen hier gelandet, weil dieses Forum, unter denen bei denen ich angemeldet bin, am ehesten zum Thema passt.
Meldet man sich irgendwo neu an wird man in der Regel -wie du andeutest- erschlagen...

Ceos
25.06.2009, 11:00
au backe ich däm... naja betriebsblind sollte reichen ....

wenn du zahlen ausgibtst, tuts

printf(variable)

NICHT

printf erwartet IMMER einen formatstring und anschliessend die variablen !

versuchs mal mit

printf("%d",ergebnis);

alternativ geht auch

printf("Das Ergebnis des Vergleichs von \"%s\" und \"%s\" lautet: %d \n",eins, zwei, ergebnis);

mit % definierst du immer einen platzhalter, das zeichen dahinter sagt demm compiler wie er es interpretieren soll

%s string
%d dezimal (evetuell auch double)
%x hex (glaube ich ... bin bissl zu lang aus dem stroff raus XD)
%i integer
%c char

in der reihenfolge der platzhalter müssen nach dem formatstring dann die parameter übergeben werden .... wenn du sonderzeichen ausgeben willst, musst du diese immer mit \ "ankündigen" also

\\ für backslash
\" hochkomma doppelt
\' hochkomma einfach
\% prozent

usw... aber dazu gibts im netz genügend seiten !


aber dass dein compiler das mit dem printf net anmeckert iss komisch, meiner hat sich gleich quergestellt!