strcmp() fkt. nicht



  • Hoffe, dass ich im richtigen Forum gelandet bin...
    Möchte gerne zwei Dateien öffnen und vergleichen.
    Die Dateien werden auch geöffnet. Nicht wundern ich habe mir die eingelesenen Strings ausgeben lassen, um herauszufinden was strcmp() überhaupt vergleicht.
    Jetzt meine Fragen:
    1. Warum wird die while-Schleife nicht richtig ausgewertet? (compare wird viermal ausgeführt, obwohl es nur jeweils zwei Zeilen in den beiden .txt-Dateien gibt)
    2. Warum gibt fgets() zwei Mal so einen kryptischen String aus?

    Konsole:

    Unterschiedliche Datensaetze
    Satz1: Dies ist der erste Satz.Dies ist der erste Satz.Dies ist der erste Satz.

    Satz2: (ç a*]ì axì a�ÕÍ"
    Unterschiedliche Datensaetze
    Satz1: Dies ist der erste Satz.Dies ist der erste Satz.Dies ist der erste Satz.
    Satz2: (ç a*]ì axì a�ÕÍ"
    Unterschiedliche Datensaetze
    Satz1: Dies ist der erste Satz.Dies ist der erste Satz.Dies ist der erste Satz.
    Satz2: Dies ist der erste Satz.Dies ist der erste Satz.Dies ist der erste Satz.

    Identische Datensaetze
    Satz1: Dies ist der erste Satz.Dies ist der erste Satz.Dies ist der erste Satz.
    Satz2: Dies ist der erste Satz.Dies ist der erste Satz.Dies ist der erste Satz.

    Code:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define MAXSTRING 81
    
    /*
     * 
     */
    int main() {
    
        FILE *d1_ptr, *d2_ptr;
        char compare1[MAXSTRING], compare2[MAXSTRING];
    
     if((d1_ptr=fopen("c:\\compare\\t1.txt","r"))==NULL || (d2_ptr=fopen("c:\\compare\\t2.txt","r"))==NULL)
                {
                    perror("Fehler beim öffnen der Datei");
                    exit(2);
                }
            else
                {
                    while (fgets(compare1, MAXSTRING, d1_ptr)!=NULL || fgets(compare2, MAXSTRING, d2_ptr)!=NULL)
                    {
                        if ((strcmp(compare1, compare2))==0)
                        {
                            printf("Identische Datensaetze");
                            printf("\nSatz1: %s \nSatz2: %s\n", &compare1, &compare2);
                        }
                        else
                        {
                            printf("Unterschiedliche Datensaetze");
                            printf("\nSatz1: %s \nSatz2: %s\n", &compare1, &compare2);
                        }
                    }
                }
    


  • Bei

    while (fgets(compare1, MAXSTRING, d1_ptr)!=NULL || fgets(compare2, MAXSTRING, d2_ptr)!=NULL)
    

    wird der zweite fgets-Aufruf aufgrund der Kurzschlussmechanik des ||-Operators nicht ausgeführt, bis aus der ersten Datei nichts mehr gelesen werden kann.



  • Bei a || b ist das Ergebnis wahr, wenn eine Bedingung wahr ist.
    Darum wird die andere Bedingung garnicht überprüft.



  • int main() {
    
        FILE *d1_ptr, *d2_ptr;
        char compare1[MAXSTRING], compare2[MAXSTRING];
    
             if((d1_ptr=fopen("c:\\compare\\t1.txt","r"))==NULL)
                {
                    perror("Fehler beim öffnen der Datei");
                    exit(2);
                }
             else if((d2_ptr=fopen("c:\\compare\\t2.txt","r"))==NULL)
             {
                    perror("Fehler beim öffnen der Datei");
                    exit(3);
             }
            else
                {
    
                    while (fgets(compare1, MAXSTRING, d1_ptr)!=NULL)
                    {
    
                        fgets(compare1, MAXSTRING, d1_ptr);
                        fgets(compare2, MAXSTRING, d2_ptr);
                        printf("%s\n%s\n", &compare1, &compare2);
                        if (strcmp(compare1, compare2)==0)
                        {
                            printf("Identische Datensaetze");
    
                        }
                        else
                        {
                            printf("Unterschiedliche Datensaetze");
    
                        }
                    }
                }
    

    Danke



  • So liest du compare1 zweimal.

    Eigentlich hätte es ausgereicht wenn du das || gegen ein && getauscht hättest.
    Denn das ist auch das, was du eigentlich haben wolltest

    "Solange (daten_von_Datei1_gelesen UND daten_von_Datei2_gelesen)"



  • Das && war bei den fgets() gemeint.
    Beim fopen() ist das || in Ordnung. Wenn beim ersten fopen() ein Fehler Auftritt, brauchst du die zweite Datei gar nicht erst öffnen.

    Und die & bei printf sind bei Arrays nicht nötig.



  • Habe von gestern auf heute noch einige Änderungen gemacht. Auch die Anmerkungen von Dirk eingebaut. Ich habe die Funktion ersetze_zeichen eingebaut um die Character des Strings ohne Leerzeichen zählen zu können. Leider muss ich wohl irgendwie einen Knoten mit den Datentypen beim "return" haben. "return makes integer from pointer without a cast". Habts ihr ne Idee, wie das sauber (und vielleicht kürzer) gelöst wäre?

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define MAXSTRING 78
    
    /*
     * 
     */
    
    char ersetze_zeichen(char *string1, char *string2)
        {
            int i,zaehler;
    
            for(zaehler=i=0;string1[i]!='\0';i++)
                if(string1[i]!=' ')
                    string2[zaehler++]=string1[i];
    
            return (string2);
        }
    
    int main(int argc, char *argv[]) {
    
        FILE *d1_ptr, *d2_ptr;
        char compare1[MAXSTRING], compare2[MAXSTRING], g_ohne[MAXSTRING];
        int i=0, ii=0;
        argv[2]="c:\\compare\\t1.txt";
        argv[3]="c:\\compare\\t2.txt";
        char *d1=argv[2];
        char *d2=argv[3];
    
            if((d1_ptr=fopen(d1,"r"))==NULL || (d2_ptr=fopen(d2,"r"))==NULL)
                {
                    perror("Fehler beim Oeffnen der Datei");
                    exit(2);
                }
            else
            {
    
                    while (!feof(d2_ptr) && !feof(d1_ptr))
                    {
    
                        fgets(compare1, MAXSTRING, d1_ptr);
                        fgets(compare2, MAXSTRING, d2_ptr);
    
                        if (strcmp(compare1, compare2)==0)
                        {
                            i=i+strlen(compare1);
    
                            printf("%s", ersetze_zeichen(compare1, g_ohne));
    
    /*
                            ii=ii+strlen(compare1);
                            printf("%s", &compare1);
    */
    
                        }
                        else
                        {
                            printf("Unterschiedliche Datensaetze\n");
                            printf("%s\n%s\n", compare1, compare2);
                            break;   
                        }
                    }
                    printf("%i", i);
                    printf("%i", ii);
               }    
    /*
        }
    */
    
        return (EXIT_SUCCESS);
    }
    


  • Dein ersetze_zeichen() gibt auch nur ein char zurück.
    Sowohl string2 als auch dein Aufruf in dem printf legen aber ein char* nahe.

    Also char *ersetze_zeichen(.....

    Und du musst noch die abschließende '\0' in dein string2 schreiben.



  • argv[2]="c:\\compare\\t1.txt";
        argv[3]="c:\\compare\\t2.txt";
    

    Das vergiss mal schnell wieder.

    feof liefert erst nach Aufruf einer Leseaktion definiertes Verhalten.
    Dein i und ii habe ich nicht verstanden.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define MAXSTRING 81
    
    char *ersetze_zeichen(char *s1,char *string2)
    {
      char *s2=string2;
      for( ;*s1;++s1 )
        if( *s1!=' ' ) *s2++=*s1;
      *s2=0;
      return string2;  
    }
    
    int main() {
    
        FILE *d1_ptr, *d2_ptr;
        char compare1[MAXSTRING], compare2[MAXSTRING];
    
     if((d1_ptr=fopen("c:\\compare\\t1.txt","r"))==NULL || (d2_ptr=fopen("c:\\compare\\t2.txt","r"))==NULL)
                {
                    perror("Fehler beim öffnen der Datei");
                    exit(EXIT_FAILURE);
                }
    while( fgets(compare1,MAXSTRING,d1_ptr) && fgets(compare2,MAXSTRING,d2_ptr) )
    {
      /* Löschen von evtl. vorhandenem '\n' da für den Vergleich hinderlich! */
      if( strchr(compare1,'\n') ) *strchr(compare1,'\n')=0;
      if( strchr(compare2,'\n') ) *strchr(compare2,'\n')=0;
    
       if ((strcmp(compare1, compare2))==0)
       {
          printf("Identische Datensaetze");
          printf("\nSatz1: %s \nSatz2: %s\n", compare1, compare2);
       }
       else
       {
          printf("Unterschiedliche Datensaetze");
          printf("\nSatz1: %s \nSatz2: %s\n", compare1, compare2);
       }
    }
    }
    

Log in to reply