Problem mit strstr()



  • Hi,
    ich tippel grad an nem kleinen Übungsprogi. Ich will nach daten in einer datei per eingabe suchen. Also ich lese zeilenweise aus einer datei und vergleiche den jeweiligen string mit der sucheingabe über "strstr". Bei übereinstimmung erfolgt eine ausgabe. Komischerweise ging das ganze mit scanf aber mit fgets nicht. Wenn ich einen vordefinierten string für "such" genommen hab hats auch geklappt.
    Naja damit hatte ich mich abgefunden. Allerdings hab ich dann noch eine schleife drumherum gebastelt, und nach dem 1. durchgang geht nischt mehr.Ich glaub ich war heut nacht auf jeder internetseite auf der ein c vorkommt.
    Ich wär echt dankbar wenn hier mal einer drüber schaut und mir das prob vllt erklären kann.

    int v;
            char c, such[BUF], dat[BUF];
            FILE *fp; 
    
            fp = fopen("nummern.txt", "r");        
    
            if (fp==NULL)
            {printf ("Datei konnte nicht geöffnet werden!"); return 0;}  
    
                    do  {
                    v=0;
    
                    printf("Bitte Suchbegriff eingeben:");    
                    scanf("%s", such);            //HIER WOLLTE FGETS() NICHT
    
                    while (fgets(dat, BUF, fp)!=NULL) {   
                    if(strstr(dat,such)!=0)  {                            
    
                                    printf ("%s", dat);     
                                    v++;
                                    }
                    }
                    printf("\n"); 
                    if (v==0)  printf ("Leider keine Übereinstimmung. Erneuter Durchlauf? j/n\n");  
                    else       printf ("Erneuter Durchlauf? j/n\n"); 
    
                    do scanf("%c", &c); while (c=='\n'); 
                    }  
                    while (c!='n');
    

    Danke, Gruß Seb.



  • bei fgets hast du auch newlines am string dran.

    strings vergleichst du auch mit strcmp. strstr ist fuer substring-suche.



  • Ok danke, das hat mir schon mal gehlofen. Das prob mit fgets() hab ich jetzt mit hilfe von strlen() gelöst. Ich meinte aber schon strstr()- hab mich bloß n bisschen unglücklich ausgedrückt.
    Aber mein Hauptproblem is die Schleife. Wieso kann ich immer nur einen Durchlauf machen. Entweder es is ihm egal was ich eingebe (bei scanf()), oder er lässt mich erst gar keine neue eingabe machen (bei fgets()). Auf jeden fall findet er ab dem 2. durchlauf keine übereinstimmung mehr.

    Muss ich vllt such[BUF] irgednwie zurücksetzen?

    [Edit]
    Ok habs gefunden. Das prob war nich such[BUF], sondern der Datei-Stream. Ich nehme an der hatte den beim ersten Durchgang bis zum Ende gelesen und beim 2. mal deshalb nicht mehr verglichen. War gestern wohl einfach zu spät. 🙂

    Danke noch mal

    Gruß, Seb.



  • You must flush the input buffer before using gets.
    fflush on input stream is an extension to the C standard

    fflush( stdin );
    


  • ollyx schrieb:

    You must flush the input buffer before using gets.
    fflush on input stream is an extension to the C standard

    fflush( stdin );
    

    Also für diese Aussage gehörst du (hier) eigentlich sofort erschossen und gevierteilt - fflush(stdin); bewirkt undefiniertes Verhalten (und nur unter MS-Compilern macht es etwas sinnvolles).



  • Um das LF loszuwerden mache ich es so:

    char *e;
    
    if ((e = strchr(buf, '\n')) != 0)
        *e = 0;
    


  • Nene, das mit fflush() lass ich mal lieber, da macht mein Linux eh nicht mit. 😉

    Aber ein kleines problem hab ich noch:
    Wenn ich scanf() benutze um die Eingabe in such[BUF] zu schreiben, funktioniert alles. Auch die Schleife ist jetzt kein Problem mehr dank rewind(). Bei fgets() allerdings kann ich weiterhin nur einen durchlauf machen (der problemlos funktioniert dank strlen()). Danach überspringt er die Eingabe für such[BUF] jedesmal automatisch.

    Woran liegt das?

    Wenn mein gefasel unklar is, kann ich auch noch mal den aktuellen code posten.

    Gruß Seb.



  • sourz schrieb:

    Wenn mein gefasel unklar is, kann ich auch noch mal den aktuellen code posten.

    Ja, das wäre eine gute Idee.



  • CStoll schrieb:

    Ja, das wäre eine gute Idee.

    Verdammt, das habe ich befürchtet...

    Hab aber leider momentan keine Zeit mich mit dem Problemchen auseinander zu setzen (Klausuren stehen an). Komm aber bald drauf zurück - versprochen. 😉


Anmelden zum Antworten