Anzahl von einem String in einem anderen String



  • Ich habe einfach meine Schleife durch Deine ersetzt und einen Zeiger *temp deklatiert und mit quelle initialisiert.

    So sieht das jetzt aus:

    // Zählt Vorkommen von einem String in einem anderen
    
    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
    	int result = 0, count = 0;
    	char quelle[160];
    	char suche[160];
    	char *temp; // Deklarierung
    		temp = quelle; // Initialisierung
    
    // EINGABE	
    	puts("Geben Sie bitte den String ein, der durchsucht werden soll: ");
    	fgets(quelle, 159, stdin);
    
    	puts("Geben Sie bitte den zu suchenden Begriff ein: ");
    	fgets(suche, 159, stdin);
    
    /*	DEAKTIVIERT
    while ( 1 )
    	{ 
    		location = strstr((quelle+count), suche);
    		count += (temp-quelle);
    		if ( temp != NULL )
    			result++;
    		else
    			break;
    	}
    	ENDE DEAKTIVIERT */
    
    	// BERECHNUNG
    		while( (temp = strstr(temp, suche)) )
    	{ 
        result++; 
        temp++; 
    	}
    
    	// AUSGABE
    	printf("\"%s\" wurde %d mal gefunden", suche, result);
    	return 0;
    }
    


  • Ah sorry, da hab ich was nicht bedacht. Bei einem normalen Aufruf von fgets() wird das '\n' im String mitgespeichert, deswegen findet er auch den Suchstring praktisch nicht, ausser wenn der Suchstring direkt am Ende des Quellstrings liegt (oder natürlich exakt dieser ist). Das '\n' entfernen macht man am besten mit der Funktion strchr(), kannst ja mal selber hirnen 😉



  • Ich habe das '\n'-Zeichen entfernt und es klappt wunderbar.
    Hier der fertige Code:

    // Zählt Vorkommen von einem String in einem anderen
    
    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
    	int result = 0; 		// Für die Anzahl der Vorkommen
    	char quelle[160];		// Quellstring
    	char suche[160];		// Suchstring
    	char nsuche[160];		// Suchstring ohne '\n'
    	char *nullzeichen;	// Ermittelt Position von '\n'
    	int position = 0;		// Position von '\n' im Suchstring
    	char *temp; 				// Deklarierung
    	temp = quelle; 			// Initialisierung
    
    // EINGABE	
    	puts("Geben Sie bitte den String ein, der durchsucht werden soll: ");
    	fgets(quelle, 159, stdin);
    
    	puts("Geben Sie bitte den zu suchenden Begriff ein: ");
    	fgets(suche, 159, stdin);
    
    // '\n' im Suchstring entfernen
    	nullzeichen = strchr(suche, '\n');
    	position = nullzeichen-suche;
    	strncpy(nsuche, suche, position);
    
    // BERECHNUNG
    		while( (temp = strstr(temp, nsuche)) )
    	{ 
        result++; 
        temp++; 
    	}
    
    // AUSGABE
    	printf("\nDer Begriff \"%s\" wurde %d mal gefunden\n", nsuche, result);
    	return 0;
    }
    

    Vielen Dank für die Hilfe!!
    :xmas1:



  • Bei fgets() sollst du schon die echte Länge des Arrays übergeben, nicht länge-1. Die Funktion "denkt" von selbst an die '\0'. Aber tröste dich, das machen fast alle Anfänger falsch 🙂

    Und die Rumrechnerei und Stringkopiererei beim entfernen des '\n' ist auch unnötig. Ein einfaches

    if ( (nullzeichen = strchr(suche, '\n')) ){
        *nullzeichen = '\0';
    }
    

    hätte auch gereicht.
    :xmas1:



  • Hi
    Ich mach das immer so:

    array[strlen(array)]='\0'
    

    Ist das so auch gut, oder überseh ich da was?



  • Jay schrieb:

    Hi
    Ich mach das immer so:

    array[strlen(array)]='\0'
    

    Ist das so auch gut, oder überseh ich da was?

    ja, das ist schon 0 😉
    :xmas2:



  • Mal davon abgesehen, dass das array[strlen(array)] Element eigentlich per Definition schon eine '\0' ist kannst du dir bei fgets() nie sicher sein, dass wirklich ein '\n' hinten drankelebt (im gegensatz zur '\0', die ist sicher).



  • Ok danke euch. Sonst hät ich das noch die nächsten 10 Jahre so geschrieben 🙄



  • Jay schrieb:

    Ok danke euch. Sonst hät ich das noch die nächsten 10 Jahre so geschrieben 🙄

    einem schlauen compiler hätte das nix ausgemacht. hättest vielleicht ein warning gesehen, wie 'removed dead code' 😉



  • char *last = string + strlen(string)-1;
      if(*last == '\n')
        *last = 0;
    

Anmelden zum Antworten