Benötige Hilfe bei einem Programm: Vergleichen von Arrays



  • 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?



  • dachschaden schrieb:

    Strings werden mit "\0" terminiert

    Wenn du schon wegen dieses/diesem aufschreist*, dann würde ich hier auch mal Einspruch erheben wollen.

    Preisfrage: welchen Wert hat

    sizeof(s)
    

    , wenn folgender String gegeben ist?

    char s[] = "\0";
    

    Strings werden mit '\0' terminiert, "\0" ist eine "Doppelnull". Wenn jeder String durch einen String terminiert würde, müsste ja auch der Terminatorstring irgendwie terminiert werden durch einen Terminatorstring, welcher wieder einen Terminatorstring bräuchte, argh, Rekursion, Überlauf, gute Nacht!

    * nach meinem Sprachgefühl ist "dieses" hier durchaus auch richtig:
    in dieses Forum: betont das Ziel. Das, was geschrieben wird, landet in diesem Forum. (die andere Bedeutungsmöglichkeit: "dieses Forum, das anderswo referenziert wird (also ein anderes Forum)" ist wohl auszuschließen)

    in diesem Forum: betont, wo der Text geschrieben wird. Zum Beispiel im Editor meiner Wahl oder direkt hier im Forumseditor.

    -> de.etc.sprache.deutsch (wenn ich noch news lesen würde)



  • wob schrieb:

    Preisfrage: welchen Wert hat

    sizeof(s)
    

    , wenn folgender String gegeben ist?

    Ist das eine rhetorische Frage?

    wob schrieb:

    Strings werden mit '\0' terminiert, "\0" ist eine "Doppelnull". Wenn jeder String durch einen String terminiert würde, müsste ja auch der Terminatorstring irgendwie terminiert werden durch einen Terminatorstring

    Hier sieht der Compiler nur das Stringarray, nicht den Inhalt, packt die '\0' dazu, und fertig.
    Weil es nämlich wahrscheinlich Leute gibt, die sich auf das dazupacken des '\0' verlassen und im Grunde einfach nur ein Array haben wollen, in dem die letzten beiden Elemente den Wert 0 haben. Und den Platz muss der Compiler dann auch liefern.

    EDIT: Paragraph gelöscht.
    EDIT2: s#"#'#g



  • oschi619 schrieb:

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

    Nochmal:
    Was meinst du macht die Anweisung array2[k] in deiner ersten for-Schleife?
    Die Antwort hatte ich schon gegeben.

    oschi619 schrieb:

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

    Das ist ein '\n' (achte auf die Richtung des \ )
    Ein \ leitet eine Escapesequence ein.
    '\n' steht für Newline und ist der Zeilenvorschub (teilweise in Verbindung mit Wagenrücklauf)
    Ein C-String wird mit '\0' terminiert. Das Zeichen mit dem Wert 0 (s. ASCII)

    Zum löschen:
    fgets speichert das '\n' von der Entertaste mit im String ab. Wenn es nicht drin steht, sind noch mehr Zeichen für die Zeile im Eingabestrom.
    Da fgets aber nach dem '\n' das Einlesen abbricht, kann es nur das letzte Zeichen sein.

    Daher:
    Ist das letzte Zeichen ein '\n', dann ersetze es durch '\0'

    Du kannst das z.B. mit printf("<%s>\n", array1); sehen.
    Wenn die > hinter dem String steht, ist kein '\n' drin. Ist sie in einer neuen Zeile, ist das '\n' noch drin.

    Am Anfang ist es evtl. besser auf Eingaben zu verzichten und die Strings direkt im Code abzulegen.

    @dachschaden
    Der Unterschied zwischen " und ' ist in C sehr groß und wichtig.
    Darum sollte man Anfänger nicht verwirren.



  • hmm.. du hast 2 Array mit "Zeichen" drin, willst du nun die arrays einfach nur vergleichen?

    Oder schaun bis zu welchem index die Zeichen der beiden array identisch sind oder wie was .. !?

    oder ist in array2 ein "teil-string" der in array1 gesucht wird?

    ich raffs nich.. p.s. ok ich habs auch nich von anfang an gelesen.. zu faul^^



  • @DirkB
    Mit array2[k] versuche ich meinen Startpunkt des zweiten Arrays zu versetzten jeweils ein Feld nach hinten. Sodass ich am Anfang vom ersten Feld an alle Felder vergleiche, wenn von dort aus die zweite Abfrage durchlaufen ist, möchte ich ein Feld weiter springen und dann wieder die zweite if-Abfrage durchlaufen usw.
    Dies funktioniert jedoch nicht, das sehe ich an meiner Ausgabe 😕 .

    das \n habe ich nun durch \0 ersetzt und bekomme so die korrekte Anzahl an Feldern angezeigt.

    Mein Vergleich mit den If Abfragen funktioniert jedoch immer noch nicht, wie ich mir das vorstelle.
    Kann es sein das ich die Anfangsposition von Array1 auch noch in einer Schleife verschieben muss um wirklich alle Zeichen miteinander zu vergleichen?

    for(array2[k]; k <= len2 ; k++)				 	//von startpos. array2. immer ein Feld weiter springen. = startpos ändern
    	{
    		printf("%c",array2[k]);
    			for(j=len2; 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=len;									// j auf den richtigen Wert zurück setzen.
    	}
    


  • Nochmal (zum 5. oder so): array2[k]; ist eine Anweisung ohne Effekt.
    Die hat keine Auswirkung.
    Die kannst du weglassen, dann passiert dasselbe.

    An der Stelle steht die Initialisierung für die Schleife (wenn sie gebraucht wird)

    oschi619 schrieb:

    Kann es sein das ich die Anfangsposition von Array1 auch noch in einer Schleife verschieben muss um wirklich alle Zeichen miteinander zu vergleichen?

    Das wäre die eine von den drei Schleifen, von der ich auch schon geschrieben habe.



  • ich bin meinen Code noch einmal durchgegangen. Mein Programm vergleicht auch die beiden Strings jedoch nicht so wie ich mir das vorstelle. kann nur nicht sagen was es genau liegt.
    Vielleicht macht sich jmd die Mühe und verfolgt meinen Code noch einmal. Die Suchschleife steht zwei Beiträge weiter oben.
    Danke schon mal.


Anmelden zum Antworten