Benötige Hilfe bei einem Programm: Vergleichen von Arrays



  • Hallo Zusammen,

    ich möchte ein Programm schreiben, das zwei Bitstrings(array1 & array2) einliest (jeweils nur 1er und 0er). Möglichst viele aneinanderhängende Felder (1er und 0er) aus dem zweite Bitstring soll im ersten Bitstring gefunden werden.
    z.B
    String1: 010101110
    String2: 000111000
    Lösung: 01110 aus dem zweiten String ist im ersten String enthalten.

    Ich beginne mit dem Vergleichen von 8 aneinanderhängenden Bits und möchte dann Bit für Bit weniger vergleichen bis ich nur noch z.b 4 Bits vergleiche.
    Ich hoffe meine Beschreibung ist einigermaßen Verständlich. Hier mein Code:

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

    #define MAX 40

    int main(void)
    {

    int i = 0;
    int j = 1;
    int k = 2;
    int l = 3;
    int m = 4;
    int n = 5;
    int o = 6;
    int p = 7;
    int q = 8;

    int x = 9;

    char array1[MAX];
    char array2[MAX];
    char maske[45];

    printf ("Kartenstring eingeben:\n");
    fgets (array1, 100,stdin);

    printf ("Ausgelesenerstring eingeben:\n");
    fgets (array2, 100,stdin);

    // hier wird der array1 zeichen für zeichen ausgegeben
    while(array1[i] != '\0')
    {
    printf("%c\n", array1[i]);
    i++;
    }

    i = 0;
    x = 9;

    while (x != 1)
    {
    int i = 0;
    int j = 1;
    int k = 2;
    int l = 3;
    int m = 4;
    int n = 5;
    int o = 6;
    int p = 7;
    int q = 8;

    switch(x)
    {
    case 9:
    while(array2[q] != '\0')
    {
    maske[0] = array2[i];
    maske[1] = array2[j];
    maske[2] = array2[k];
    maske[3] = array2[l];
    maske[4] = array2[m];
    maske[5] = array2[n];
    maske[6] = array2[o];
    maske[7] = array2[p];
    maske[8] = array2[q];
    printf("%s\n", maske);

    if(strstr (array1, maske))
    printf("Beide Arrays haben %d uebereinstimmungen\n An der Stelle %d\n", q, i);
    else
    printf("Die Arrays sind unterschiedlich\n");

    i++;
    j++;
    k++;
    l++;
    m++;
    n++;
    o++;
    p++;
    q++;

    }

    case 8:
    while(array2[p] != '\0')
    {
    maske[0] = array2[i];
    maske[1] = array2[j];
    maske[2] = array2[k];
    maske[3] = array2[l];
    maske[4] = array2[m];
    maske[5] = array2[n];
    maske[6] = array2[o];
    maske[7] = array2[p];
    printf("%s\n", maske);

    if(strstr (array1, maske))
    printf("Beide Arrays haben %d uebereinstimmungen\n An der Stelle %d\n", p, i);
    else
    printf("Die Arrays sind unterschiedlich\n");

    i++;
    j++;
    k++;
    l++;
    m++;
    n++;
    o++;
    p++;

    }

    case 7:
    while(array2[o] != '\0')
    {
    maske[0] = array2[i];
    maske[1] = array2[j];
    maske[2] = array2[k];
    maske[3] = array2[l];
    maske[4] = array2[m];
    maske[5] = array2[n];
    maske[6] = array2[o];
    printf("%s\n", maske);

    if(strstr (array1, maske))
    printf("Beide Arrays haben %d uebereinstimmungen\n An der Stelle %d\n", o, i);
    else
    printf("Die Arrays sind unterschiedlich\n");

    i++;
    j++;
    k++;
    l++;
    m++;
    n++;
    o++;

    }

    case 6:
    while(array2[n] != '\0')
    {
    maske[0] = array2[i];
    maske[1] = array2[j];
    maske[2] = array2[k];
    maske[3] = array2[l];
    maske[4] = array2[m];
    maske[5] = array2[n];
    printf("%s\n", maske);

    if(strstr (array1, maske))
    printf("Beide Arrays haben %d uebereinstimmungen\n An der Stelle %d\n", n, i);
    else
    printf("Die Arrays sind unterschiedlich\n");

    i++;
    j++;
    k++;
    l++;
    m++;
    n++;

    }

    case 5:
    while(array2[m] != '\0')
    {
    maske[0] = array2[i];
    maske[1] = array2[j];
    maske[2] = array2[k];
    maske[3] = array2[l];
    maske[4] = array2[m];
    printf("%s\n", maske);

    if(strstr (array1, maske))
    printf("Beide Arrays haben %d uebereinstimmungen\n An der Stelle %d\n", m, i);
    else
    printf("Die Arrays sind unterschiedlich\n");

    i++;
    j++;
    k++;
    l++;
    m++;

    }

    case 4:
    while(array2[l] != '\0')
    {
    maske[0] = array2[i];
    maske[1] = array2[j];
    maske[2] = array2[k];
    maske[3] = array2[l];
    printf("%s\n", maske);

    if(strstr (array1, maske))
    printf("Beide Arrays haben 4 uebereinstimmungen\n An der Stelle %d\n", i);
    else
    printf("Die Arrays sind unterschiedlich\n");

    i++;
    j++;
    k++;
    l++;
    break;

    }
    default:
    printf("Keine Übereinstimmungen");
    }

    x--;
    }
    }

    Ich hoffe mir kann jmd weiterhelfen 😕



  • Nein, es reicht.
    Leute, die sich nicht die Mühe machen, ihren verschissenen Code in Codetags zu packen, bekommen einen Hinweis auf den Sticky und sonst gar nichts mehr.



  • Okay sorry, das ist mein erster kontakt mit diesen Forum

    # include <stdio.h> 
    # include <string.h> 
    # include <stdlib.h> 
    
    #define MAX 40 
    
    int main(void) 
    { 
    
    int i = 0; 
    int j = 1; 
    int k = 2; 
    int l = 3; 
    int m = 4; 
    int n = 5; 
    int o = 6; 
    int p = 7; 
    int q = 8; 
    
    int x = 9; 
    
    char array1[MAX]; 
    char array2[MAX]; 
    char maske[45]; 
    
    printf ("Kartenstring eingeben:\n"); 
    fgets (array1, 100,stdin); 
    
    printf ("Ausgelesenerstring eingeben:\n"); 
    fgets (array2, 100,stdin); 
    
    // hier wird der array1 zeichen für zeichen ausgegeben	
    while(array1[i] != '\0') 
    { 
    printf("%c\n", array1[i]); 
    i++; 
    } 
    
    i = 0; 
    x = 9; 
    
    while (x != 1) 
    { 
    int i = 0; 
    int j = 1; 
    int k = 2; 
    int l = 3; 
    int m = 4; 
    int n = 5; 
    int o = 6; 
    int p = 7; 
    int q = 8; 
    
    switch(x) 
    { 
    case 9: 
    while(array2[q] != '\0') 
    { 
    maske[0] = array2[i]; 
    maske[1] = array2[j]; 
    maske[2] = array2[k]; 
    maske[3] = array2[l]; 
    maske[4] = array2[m]; 
    maske[5] = array2[n]; 
    maske[6] = array2[o]; 
    maske[7] = array2[p]; 
    maske[8] = array2[q]; 
    printf("%s\n", maske); 
    
    if(strstr (array1, maske)) 
    printf("Beide Arrays haben %d uebereinstimmungen\n An der Stelle %d\n", q, i); 
    else 
    printf("Die Arrays sind unterschiedlich\n"); 
    
    i++; 
    j++; 
    k++; 
    l++; 
    m++; 
    n++; 
    o++; 
    p++; 
    q++; 
    
    } 
    
    case 8:	
    while(array2[p] != '\0') 
    { 
    maske[0] = array2[i]; 
    maske[1] = array2[j]; 
    maske[2] = array2[k]; 
    maske[3] = array2[l]; 
    maske[4] = array2[m]; 
    maske[5] = array2[n]; 
    maske[6] = array2[o]; 
    maske[7] = array2[p]; 
    printf("%s\n", maske); 
    
    if(strstr (array1, maske)) 
    printf("Beide Arrays haben %d uebereinstimmungen\n An der Stelle %d\n", p, i); 
    else 
    printf("Die Arrays sind unterschiedlich\n"); 
    
    i++; 
    j++; 
    k++; 
    l++; 
    m++; 
    n++; 
    o++; 
    p++; 
    
    } 
    
    case 7: 
    while(array2[o] != '\0') 
    { 
    maske[0] = array2[i]; 
    maske[1] = array2[j]; 
    maske[2] = array2[k]; 
    maske[3] = array2[l]; 
    maske[4] = array2[m]; 
    maske[5] = array2[n]; 
    maske[6] = array2[o]; 
    printf("%s\n", maske); 
    
    if(strstr (array1, maske)) 
    printf("Beide Arrays haben %d uebereinstimmungen\n An der Stelle %d\n", o, i); 
    else 
    printf("Die Arrays sind unterschiedlich\n"); 
    
    i++; 
    j++; 
    k++; 
    l++; 
    m++; 
    n++; 
    o++; 
    
    } 
    
    case 6: 
    while(array2[n] != '\0') 
    { 
    maske[0] = array2[i]; 
    maske[1] = array2[j]; 
    maske[2] = array2[k]; 
    maske[3] = array2[l]; 
    maske[4] = array2[m]; 
    maske[5] = array2[n]; 
    printf("%s\n", maske); 
    
    if(strstr (array1, maske)) 
    printf("Beide Arrays haben %d uebereinstimmungen\n An der Stelle %d\n", n, i); 
    else 
    printf("Die Arrays sind unterschiedlich\n"); 
    
    i++; 
    j++; 
    k++; 
    l++; 
    m++; 
    n++; 
    
    } 
    
    case 5: 
    while(array2[m] != '\0') 
    { 
    maske[0] = array2[i]; 
    maske[1] = array2[j]; 
    maske[2] = array2[k]; 
    maske[3] = array2[l]; 
    maske[4] = array2[m]; 
    printf("%s\n", maske); 
    
    if(strstr (array1, maske)) 
    printf("Beide Arrays haben %d uebereinstimmungen\n An der Stelle %d\n", m, i); 
    else 
    printf("Die Arrays sind unterschiedlich\n"); 
    
    i++; 
    j++; 
    k++; 
    l++; 
    m++; 
    
    } 
    
    case 4: 
    while(array2[l] != '\0') 
    { 
    maske[0] = array2[i]; 
    maske[1] = array2[j]; 
    maske[2] = array2[k]; 
    maske[3] = array2[l]; 
    printf("%s\n", maske); 
    
    if(strstr (array1, maske)) 
    printf("Beide Arrays haben 4 uebereinstimmungen\n An der Stelle %d\n", i); 
    else 
    printf("Die Arrays sind unterschiedlich\n"); 
    
    i++; 
    j++; 
    k++; 
    l++; 
    break;	
    
    } 
    default: 
    printf("Keine Übereinstimmungen"); 
    } 
    
    x--; 
    } 
    }
    

  • Mod

    Jetzt noch den Code einrücken und statt den allgemeinen Code-Tags die für C verwenden.

    Schleifen! Benutze Schleifen! Und Funktionen! Man darf auch Schleifen in anderen Schleifen schreiben. Wann immer du Code schreibst, der so ganz ähnlich schon an anderer Stelle in deinem Programm steht, hast du etwas falsch gemacht. Zähl mal, wie oft das in diesem Programm ungefähr passiert! Das gilt sowohl für einzelne Zeilen, als auch für ganze Blöcke von Code. Sprich: Das Programm könnte man leicht um einen Faktor 10 verkürzen, indem man die Wiederholungen raus macht. Und wenn man dann einzelne Blöcke mit jeweils genau definierten Aufgaben hat, die jeweils nur ~10 Zeilen lang sind, dann fällt es auch viel leichter, diese zum fehlerfreien Funktionieren zu bringen, als wenn man ein Ungetüm von über 200 Zeilen hat.

    Vergleiche von und das Suchen in Zeichenketten sind zudem Standardaufgaben, für die es schon fertige Funktionen gibt. Wenn man diese benutzt, könnte man das ganze Programm vermutlich auf 5-10 Zeilen verkürzen und müsste sich zudem gar nicht darum sorgen, ob diese Unterfunktionen korrekt funktionieren. Damit könnte das als Pseudocode ungefähr so aussehen:

    lese zeichenkette_1;
    lese zeichenkette_2;
    schleife: suchlänge laufe von der länge von zeichenkette_2 bis 0:
      schleife: startposition laufe vom anfang von zeichenkette_2, bis startposition + suchlänge > länge von zeichenkette_2
        suche den string von startposition bis startposition + suchlänge in zeichenkette_1. 
        falls gefunden -> du hast dein ergebnis
        andernfalls -> fahre fort
    Fertig.
    


  • oschi619 schrieb:

    String1: 010101110
    String2: 000111000
    Lösung: 01110 aus dem zweiten String ist im ersten String enthalten.

    spontan fällt mir nur die triviallösung ein: string2 in alle möglichen teilstrings zerlegen und sie dann mit strstr in string1 suchen.
    geht bestimmt effizienter, aber ich weiss nicht wie.



  • Oh Gott, bitte nochmal ein C Buch nehmen und die Grundlagen über Arrays, C-Strings, Schleifen wiederholen. Dein C Code ist furchtbar, er ist ungefähr so, als wenn du beim Basteln einen Hammer anstatt eines Schreibenziehner nimmst, um die Schrauben fest zu machen. Genau so viel Schaden entsteht.

    Und auch wenn Code Einrücken nur eine Stillfrage ist (denn du kannst C Code in einer Zeile schreiben), wenn du so den Code in einem Editor hast, wirst du gar nicht vorankommen.

    Ich habe relativ kurz aufgehört zu versuchen deinen Code zu entschlüsseln. Dabei sind mir gravierende Fehler aufgefallen:

    1. Du reservierst 40 Zeichen für array1 und array2 , jedoch liest bis 100 Zeichen mit fgets . Wie sollen 100 Zeichen in 40 Bytes passen? Genau, gar nicht. Damit hast du einen Overflow und schreibst Daten im Speicher, die du nicht reserviert hast ==> böser Bug

    while(array1[i] != '\0') 
    { 
      printf("%c\n", array1[i]); 
      i++; 
    }
    

    An sich ist der Code nicht falsch, aber in der Regel nutzt man dafür eine for -Schleife

    size_t len = strlen(array1);
    for(i=0; i < len; ++i)
      printf("%c\n", array1[i]);
    

    ist nicht nur kompakter, weniger fehleranfällig und vor allem wie verbreiter. Jeder sieht auf Anhieb was du vorhast. Bei deiner Variante ist das nicht sofort offensichtlich und muss man genau hinschauen. Außer es gibt einen guten Grund, man sollte Pattern verwenden, die von den meisten verwendet werden.

    1. maske ist C-String, somit muss es 0-terminiert sein. Du kümmerst dich nicht darum und schreibst dennoch printf("%s\n", maske); . Das ist wieder mal nen Hammer statt eines Schraubenziehers zu nehmen. Siehe Kommentar 1. Und dass zufällig mit deiner Eingabe passt, weil array1[8] zufällig \0 ist, ist Kake. Wenn man "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" als zweite Eingabe hat, dann kracht es.

    4. Benenne Variablen so, dass man erkennt, wofür sie da sind. i und j sind gut, wenn man sie als Laufindex verwendet, das stimmt. Wenn man aber mehr als 3 oder 4 Laufindizes hat, finde ich dass die Code Lesbarkeit darunter leidet, wenn man nur Einzel-Buchstaben Variablen hat. In deinem Fall sind es 9, da kann man die Indizes schlech voneinander trennen. Bei 9 Indizes nebeneinander hast du einen guten Indikator, dass du was falsch machst.



  • supertux schrieb:

    while(array1[i] != '\0') 
    { 
      printf("%c\n", array1[i]); 
      i++; 
    }
    

    An sich ist der Code nicht falsch, aber in der Regel nutzt man dafür eine for -Schleife

    Huh? Bitte ... huh?

    Ich bin der Erste in der Reihe, wenn es darum geht, auf die bekloppte NUL-Terminierung von C-Strings draufzuhauen - da braucht man dann einfach die Länge, die man mit strlen oder, bei Arrays, mit einem strlen_constant ermitteln kann:

    #define strlen_constant(string)  ((sizeof(string) / sizeof((string)[0])) - 1)
    

    Aber: wenn man immer mit NUL-terminierten Strings arbeitet, kann man sich das strlen auch einfach sparen. Damit erzeugt man nur nochmal einen Durchlauf des Strings. Nicht unnötig, aber unnötig so, wie der OP seine Arrays durchgeht.



  • Danke schon einmal für die Antworten.

    ich habe nun versucht die Lösung von Sepp J zu verfolgen. HierbeI habe ich noch einge Fragen ob mein code soweit richtig ist...

    In der Zeile 34 (erste Schleife) lege ich meine Startposition für den Suchstring (array2) fest.
    In der Zeile 36 (zweite Schliefe) lege ich die länge der Suchschleife fest. In der darauffolgenden If Abfrage möchte ich die Suchstring (Startposition+Suchlänge) mit dem Array1 vergliechen. Hierbei weiß ich jedoch nicht wie ich die versch. Arrayfelder bzw. längen der Arrays abfragen soll?

    array2[k+j]
    

    ist quatsch?!.
    Kann mir hier jemand weiterhelfen? Danke.

    # include <stdio.h>
    # include <string.h>
    # include <stdlib.h>
    
    #define MAX 45
    
    int main(void) 
    {
    
       	int i = 0;  //Variable im array1
       	int j = 0;  //Variable im array2 Suchlänge
       	int k = 0;  //Startpos.
    
      	char array1[MAX];
      	char array2[MAX];
      	char maske[45];
    
    	printf ("Kartenstring eingeben:\n");
    	fgets (array1, 42,stdin);
    
    	printf ("Ausgelesenerstring eingeben:\n");
    	fgets (array2, 42,stdin);
    
    	// hier wird der array1 zeichen für zeichen ausgegeben	
    	size_t len = strlen(array1);
    	for(i=0; i < len; ++i)
    	{
    	  printf("%c\n", array1[i]);
    	}
    
    	// suchschleife
    	size_t len2 = strlen(array2);   		 	 //ermitteln von länge array2
    	for(array2[k]; k = len2 ; k++)				 //von startpos. array2. immer ein Feld weiter springen. = startpos ändern
    	{
    			for(j=len2; j =1 ; j--)			 	 //schleife: von Gesamtlänge array2 bis länge =1 = suchlänge
    			{				
    				if(strstr (array1, array2[k+j]))  //suche string von startpos bis startpos+ suchlänge in array1.
    				printf("Beide Arrays haben %d uebereinstimmungen\n An der Stelle %d\n", j, k);
    				else
    				printf("Die Arrays sind unterschiedlich\n");
    			}	
    	}		 	
    }
    


  • Schau dir noch mal die richtige Verwendung der for-Schleifen an (insb. der 2. Parameter)!



  • Okay. Der 2.parameter sagt mir wann die for schleife beendet wird.
    Bei der suchschleife:
    1.for-Schleife ändere ich die startposition meines Sucharrays solange bis der Wert, der Länge meines arrays hat. (Ich ändere die startposition bis zum letzten Feld des suchArray).

    Bei der 2.for-Schleife ändere ich die Länge des sucharrays von der Max Länge des array2 bis herunter zu einem Feld des Arrays.
    Sehe ich das soweit richtig?

    Ich stelle mir nun immer noch die Frage wie ich die verschiedenen Längen und Startpunkte meines sucharrays mit dem Array1 vergleichen kann?

    Es wäre nett wenn mir hier jmd. Weiterhelfen könnte.

    Gruß



  • Wenn die Statements der for-Schleife mal einzeln geschrieben werden, was bewirken die?

    array2[k]; 
    k = len2;
    k++;
    
    j=len2; 
    j =1 ; 
    j--;
    

    (Schreib ruhig Kommentare dahinter)


  • Mod

    oschi619 schrieb:

    Okay. Der 2.parameter sagt mir wann die for schleife beendet wird.

    Schon falsch. Der zweite Ausdruck sagt, wann die Schleife läuft.



  • Hallo,
    ich habe im zweiten Parameter eine Zusweisung und keinen Vergleich...

    array2[k]; //initialisierung start bei k. int =0
    k = len2;  //hier mein fehler... sollte k<= len2 heißen: läuft so lange, solange k kleiner gleich len2 ist
    k++        // k bei jedem durchlauf um 1 hochzählen
    

    nun habe ich aber immer noch die Frage mit dem Vergleichsarray.

    array2[k+j];
    

    wie kann ich eine bestimmte läng von Feldern eines Arrays, mit einem anderen Array Vergleichen?

    Danke



  • array2[k]; // Code ohne Effekt. 
    k = len2;  // k bekommt den Inhalt (Wert) von len2. Das ist eine Zuweisung, kein Vergleich
    k++        // Nach dem Zugriff auf k, k um eins erhöhen
    

    Da spielt es keine Rolle, ob der Code in einer for-Anweisung steht.

    oschi619 schrieb:

    wie kann ich eine bestimmte läng von Feldern eines Arrays, mit einem anderen Array Vergleichen?

    Dafür gibt es memcmp oder, wenn es um Zeichenketten geht, strncmp (beachte das n in der Mitte)



  • nach diesen oder ähnlichen Funktionen habe ich bereits gegoogelt, jedoch nicht glücklich damit geworden.
    Mit memcmp kann ich jedoch nur die ertsen n Zeichen eines arrays vergliechen. Fällt raus da ich auch innerhalb eines Arrays Felder vergleichen möchte. Richtig?
    Mit strcmp kann ich zwar zwei arrays vergleichen. Ich weiß jedoch nicht wie ich z.B das 2 bis 5 feld eines arrays mit einem anderen vergleichen kann? 😕 😕


  • Mod

    oschi619 schrieb:

    Mit memcmp kann ich jedoch nur die ertsen n Zeichen eines arrays vergliechen. Fällt raus da ich auch innerhalb eines Arrays Felder vergleichen möchte. Richtig?
    Mit strcmp kann ich zwar zwei arrays vergleichen. Ich weiß jedoch nicht wie ich z.B das 2 bis 5 feld eines arrays mit einem anderen vergleichen kann? 😕 😕

    Du beschreibst zwei Mal das gleiche, aber bei einem Mal denkst du, es hilft dir, beim anderen Mal nicht? 😕

    All die Funktionen, die du beschrieben hast, nehmen Zeiger als Argumente, keine Arrays (in C können Arrays gar nicht direkt Funktionsargumente sein!). Ein Array ist kein physisches Konstrukt, das ist einfach nur eine Art und Weise, über Speicherbereiche nachzudenken, die dir beim Programmieren hilft. Die Funktionen strncmp und memcmp nehmen als Argumente zwei Zeiger und eine Länge und vergleichen dann die Speicherbereiche dahinter, egal ob du über diese Bereiche als Array denkst oder nicht.

    Weiterhin wird der Bezeichner eines Arrays innerhalb eines Ausdrucks (fast) immer als ein Zeiger auf sein erstes Element angesehen. Das heißt, du kannst Zeigerarithmetik damit machen (d.h. mit dem Zeiger rechnen).

    int array[1234];
    array;    // Dies ist ein Zeiger auf das erste Element des Arrays
    array + 1;  // Dies ist ein Zeiger auf ein Element weiter hinten, also das zweite
    array + 2;  // Das dritte Element
    // usw.
    

    Das darfst du natürlich auch als Argument für memcmp/strncmp benutzen.



  • oschi619 schrieb:

    nach diesen oder ähnlichen Funktionen habe ich bereits gegoogelt, jedoch nicht glücklich damit geworden.
    Mit memcmp kann ich jedoch nur die ertsen n Zeichen eines arrays vergliechen. Fällt raus da ich auch innerhalb eines Arrays Felder vergleichen möchte. Richtig?

    Falsch.
    Du kannst beliebige (dem Programm zugewiesene) Speicherbereiche damit vergleichen.
    Du musst halt nur die Anfangsadressen der Bereiche kennen.

    oschi619 schrieb:

    Mit strcmp kann ich zwar zwei arrays vergleichen. Ich weiß jedoch nicht wie ich z.B das 2 bis 5 feld eines arrays mit einem anderen vergleichen kann? 😕 😕

    strcmp hatte ich gar nicht vorgeschlagen.
    Das ist auch nicht für den Vergleich von Arrays gedacht.

    Ist dir der Unterschied zwischen einem Array und einem C-String bewußt?
    Daraus folgt dann auch der Unterschied zwischen memcmp und strncmp .



  • Danke erst mal für die Beiträge.
    Ich habe es nun noch einmal versucht, jedoch ohne wirklichen Erfolg.
    Mit strlen lese ich die Anzahl der Zeichen des Arrays aus + \n. Deshlab ziehe ich von der Anzahl jeweils eins ab? Richtig?
    Bei meinem Vergleich ab Zeile 42 funktioniert jedoch etwas nicht richtig.

    Vielleicht kann mir jemand weiter Helfen.

    Hier der Code

    # include <stdio.h>
    # include <string.h>
    # include <stdlib.h>
    
    #define MAX 45
    
    int main(void) 
    {
       	int i = 0;  //Variable im array1
       	int j = 0;  //Variable im array2 Suchlänge
       	int k = 0;  //Startpos.
    
      	char array1[MAX];
      	char array2[MAX];
      	char maske[MAX];
    
    	printf ("Kartenstring eingeben:\n");
    	fgets (array1, 42,stdin);
    
    	printf ("Ausgelesenerstring eingeben:\n");
    	fgets (array2, 42,stdin);
    
    	// hier wird der array1 zeichen für zeichen ausgegeben	
    	size_t len = strlen(array1);
    	printf("Array1 Anzahl Zeichen %d\n\n", len-1);								//ermitteln der länge array1???
    	for(i=0; i <= len-1; ++i)
    	{
    	  printf("%c", array1[i]);
    	}
    	printf("\n");
    
    	// hier wird der array2 zeichen für zeichen ausgegeben	
    	size_t len2 = strlen(array2);
    	printf("Array2 Anzahl Zeichen %d\n\n", len2-1);								//ermitteln der länge array2???
    	for(i=0; i <= len2-1; ++i)
    	{
    	  printf("%c", array2[i]);
    	}
    	printf("\n");
    
    	// suchschleife	
    	for(array2[k]; k <= len2-1 ; k++)				 	//von startpos. array2. immer ein Feld weiter springen. = startpos ändern
    	{
    			for(j=len2-1; j >=1 ; j--)			 		//schleife: von Gesamtlänge array2 bis länge=1 = suchlänge
    			{	
    				if(memcmp(array1, array2+k,j))			//vergliech array2 von startpos. k mit der länge j??
    				printf("Beide Arrays haben %d uebereinstimmungen\n An der Stelle %d\n", j, k);
    				else
    				printf("Die Arrays sind unterschiedlich\n");						
    			}
    			j=len2-1;									// j auf den richtigen Wert zurück setzen.
    	}
    	k=0;
    	return EXIT_SUCCESS;		 	
    }
    


  • oschi619 schrieb:

    Danke erst mal für die Beiträge.

    Hast du die auch durchgelesen und versucht zu verstehen.

    oschi619 schrieb:

    Ich habe es nun noch einmal versucht, jedoch ohne wirklichen Erfolg.

    Also nicht gelesen und/oder verstanden.

    oschi619 schrieb:

    Mit strlen lese ich die Anzahl der Zeichen des Arrays aus + \n. Deshlab ziehe ich von der Anzahl jeweils eins ab? Richtig?

    Es wäre einfacher, das '\n' (sofern vorhanden) aus dem String zu entfernen.

    oschi619 schrieb:

    Bei meinem Vergleich ab Zeile 42 funktioniert jedoch etwas nicht richtig.

    !. Du verglechst Strings. darum ist strncmp besser geeignet.
    2. Schau dir mal genau die Bedeutung vom Rückgabewert von memcmp/strncmp an
    3. Brauchst du drei Schleifen.
    4. kannst du erst am Ende aller Vergleiche sagen, dass keine Übereinstimmung gefunden wurde.



  • Hallo

    - ich habe die Beiträge durchgelesen, sonst würde ich nicht in dieses Forum schreiben.
    -Möglicherweise habe ich es nicht verstanden was geschrieben wurde, deshalb versuche ich über ein Forum eine Erklärung zu bekommen.
    - ich weiß leider nicht wie man '/n' aus einem String löscht. Ich denke an jedem Ende eines Strings steht '/n'?

    Nun habe ich memcmp mit strncmp ausgetauscht, da ich Zeichen von Strings vergleiche. Desweiteren habe ich mir die Rückgabewerte angeschaut und einen Vergleich auf == 0 vorgenommen.

    ja ich denke ich brauche 3 Schleifen. In der ersten wird die Startadresse verschoben, in der zweiten die Länge des Suchstrings und in der if Abfrage findet der letztliche Vergleich statt?
    Der Vergleich funktioniert jedoch noch nicht richtig.

    for(array2[k]; k <= len2-1 ; k++)				 	//von startpos. array2. immer ein Feld weiter springen. = startpos ändern
    	{
    			for(j=len2-1; j >=1 ; j--)			 		//schleife: von Gesamtlänge array2 bis länge=1 = suchlänge
    			{	
    				check=(strncmp(array1, array2+k,j));     //vergliech array2 von startpos. k mit der länge j??
    				if (check == 0)		
    				printf("Beide Arrays haben %d uebereinstimmungen\n An der Stelle %d\n", j, k);
    				else
    				printf("Die Arrays sind unterschiedlich\n");						
    			}
    			j=len2-1;									// j auf den richtigen Wert zurück setzen.
    	}
    


  • oschi619 schrieb:

    sonst würde ich nicht in dieses Forum schreiben.

    Diesem.

    oschi619 schrieb:

    ich weiß leider nicht wie man '/n' aus einem String löscht. Ich denke an jedem Ende eines Strings steht '/n'?

    Erstens: wenn schon, dann '\n'.
    Zweitens: hast du dein C-Buch überhaupt mal aufgeschlagen? Strings werden mit '\0' terminiert, nicht mit '\n'. fgets schreibt unter Umständen ein '\n' rein, sprich, wenn genug Speicher vorhanden war, um die Usereingabe zu verarbeiten.
    Drittens: Auf '\n' kannst du ja leicht prüfen. Und wenn du eh mit Längenbegrenzung arbeitest, subtrahierst du von der Stringlänge des Users einfach 1, das ist dann das "Löschen" von '\n'.
    Viertens: Codetags kannst du auch die Sprache übergeben, in der du schreibst.

    for(array2[k]; k <= len2-1 ; k++)
    

    Erstens: Was zur Hölle soll array2[k] im Initialisierungsteil?
    Zweitens: k <= len2-1 kannst du auch einfacher schreiben: k < len2
    Drittens: Von korrekter Einrückung hast du noch nie was gelesen, oder?

    oschi619 schrieb:

    ich brauche 3 Schleifen [...] und in der if Abfrage findet der letztliche Vergleich statt?

    Erstens.
    Zweitens: Du hast bereits die Länge der zu überprüfenden Bytes, den '\0'-Check in strncmp kannst du dir eigentlich sparen.
    Drittens: Du willst immer den längsten Substring haben, oder? Wo merkst du dir denn die Position davon? Und wo die Länge? Was, wenn du was längeres findest?


Anmelden zum Antworten