-
        

Ergebnis 1 bis 4 von 4

Thema: strcmp lässt programm abstürzen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    22.02.2005
    Beiträge
    78

    strcmp lässt programm abstürzen

    Anzeige

    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?

    Code:
    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.

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.364
    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!!

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    22.02.2005
    Beiträge
    78
    Jetzt wirds haarig. Selbst das:
    Code:
    #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...

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.364
    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!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •