Denkanstöße zu gestellter Aufgabe



  • Realisieren Sie die folgenden Funktionen:

    int strend (const char *s, const char *t)

    liefert 1, wenn der String t am Ende des String s steht, und 0 sonst.

    wenn ich das richtig lese geht es um den Zeiger bzw. Pointer

    Jedoch weiß ich nicht genau wie ich das realisieren soll.

    Hierbei sind die constanten keine Felder also wie kann ich das prüfen ?

    Irgendwie bin ich dabei ein wenig ratlos.



  • Freezerr schrieb:

    Realisieren Sie die folgenden Funktionen:

    int strend (const char *s, const char *t)

    liefert 1, wenn der String t am Ende des String s steht, und 0 sonst.

    wenn ich das richtig lese geht es um den Zeiger bzw. Pointer

    Jedoch weiß ich nicht genau wie ich das realisieren soll.

    Hierbei sind die constanten keine Felder also wie kann ich das prüfen ?

    Irgendwie bin ich dabei ein wenig ratlos.

    const char* ist in C meist ein nullterminierter String (aka. eine Zeichenkette).

    int main(void) {
      int a = strend("abbb", "bbb"); // 1 abbb endet auf bbb
      int b = strend("abbb", "c"); //0 abbb endet nicht auf c
    }
    


  • Freezerr schrieb:

    Jedoch weiß ich nicht genau wie ich das realisieren soll.

    Du könntest zuerst festellen, ob s länger oder gleich lang ist wie t und dann mit memcmp (oder strcmp) prüfen, ob s auf t endet. wenn s länger ist als t, denn prüfe ab s+strlen(s)-strlen(t).



  • Andromeda schrieb:

    Du könntest zuerst festellen, ob s länger oder gleich lang ist wie t und dann mit memcmp (oder strcmp) prüfen, ob s auf t endet. wenn s länger ist als t, denn prüfe ab s+strlen(s)-strlen(t).

    Warum nicht gleich einfach letztere Prüfung?



  • qwertzy schrieb:

    Andromeda schrieb:

    Du könntest zuerst festellen, ob s länger oder gleich lang ist wie t und dann mit memcmp (oder strcmp) prüfen, ob s auf t endet. wenn s länger ist als t, denn prüfe ab s+strlen(s)-strlen(t).

    Warum nicht gleich einfach letztere Prüfung?

    Wenn strlen(s) < strlen(t) kann man sich den Rest ja sparen.



  • Andromeda schrieb:

    Wenn strlen(s) < strlen(t) kann man sich den Rest ja sparen.

    Ja, das wäre aber auch die einzige Bedingung die ich vor der Logik noch prüfen wurde.


  • Mod

    qwertzy schrieb:

    Andromeda schrieb:

    Wenn strlen(s) < strlen(t) kann man sich den Rest ja sparen.

    Ja, das wäre aber auch die einzige Bedingung die ich vor der Logik noch prüfen wurde.

    Du musst bei dem Ansatz aber sowieso erst einmal die Anfangsposition für den Vergleich finden, dazu muss also vorher einmal durch die Zeichenketten gegangen werden.



  • SeppJ schrieb:

    Du musst bei dem Ansatz aber sowieso erst einmal die Anfangsposition für den Vergleich finden, dazu muss also vorher einmal durch die Zeichenketten gegangen werden.

    Wieso finden? Sofern die Länge der beiden Strings ermittelt ist, ist doch die Anfangsposition für den Vergleich klar?


  • Mod

    qwertzy schrieb:

    SeppJ schrieb:

    Du musst bei dem Ansatz aber sowieso erst einmal die Anfangsposition für den Vergleich finden, dazu muss also vorher einmal durch die Zeichenketten gegangen werden.

    Wieso finden? Sofern die Länge der beiden Strings ermittelt ist, ist doch die Anfangsposition für den Vergleich klar?

    Dieses finden der Länge eines nullterminierten Strings ist keine triviale Operation. Wenn man das schon macht, dann will man möglichst viel dabei heraus holen. Ich habe auch das Gefühl, du übersiehst derzeit, dass die Anfangsposition nicht pauschal s+strlen(s)-strlen(t) sein kann, weil eventuell strlen(s) < strlen(t) , wodurch dann s+strlen(s)-strlen(t) < s wäre.

    edit: Kann's sein, dass du, ich, und Andromeda alle genau das gleiche meinen und nur aneinander vorbei reden?



  • SeppJ schrieb:

    edit: Kann's sein, dass du, ich, und Andromeda alle genau das gleiche meinen und nur aneinander vorbei reden?

    Ja, ich glaube auch. Ist alles etwas wirr, wenn man nicht gleich die Lösung dazu posten will, daher vermutlich.
    Der OP sollte ja jetzt aber genug Anstöße haben, um das umzusetzen.



  • int strend (const char *s, const char *t) {
    	const char *_s, *_t;
    	if (!*s) return 0;
    	_s = s;
    	_t = t;
    	for (; *_s == *_t; _s++, _t++) if (!*_t) return 1;
    	return strend(s+1, t);
    }
    


  • qwertzy schrieb:

    ...

    Da fehlt ein Smiley, sonst könnte das noch einer ernsthaft irgendwo verwenden.



  • qwertzy schrieb:

    int strend (const char *s, const char *t) {
    	const char *_s, *_t;
    	if (!*s) return 0;
    	_s = s;
    	_t = t;
    	for (; *_s == *_t; _s++, _t++) if (!*_t) return 1;
    	return strend(s+1, t);
    }
    

    Klau nicht mein schönen Namen und poste dann sowas damit, das ist nicht cool.

    Erklär mal was Dich zu diesem Lösungsansatz bewegt hat?



  • Test



  • Habe es mal so aufgebaut was meint ihr dazu?
    Also die Aufgabe bestand aus mehreren Teilen also nicht wundern das es so viel ist

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    /* 1. Eingabe: String
       2. Eingabe: String der am ende des 1. String sein soll
    	1.Ausgabe: 1 wenn 2. String am ende steht, 0 wenn nicht
       3. Eingabe: String
       4. Eingabe: Buchstabe, der im 3. String sein soll
    	2.Ausgabe: Pointer, der auf den hintersten 4. Buchstaben im 3. String zeigt
       5. Eingabe: String
       6. Eingabe: String, der im 5. String vorkommen soll
    	3.Ausgabe: Pointer, der auf den vordersten 6. String im 5. String zeigt
    */
    
    int strend (const char *s, const char *t) {
    	int i, b, v, z=1;
    
    	b= strlen(s);
    	v= strlen(t);
    	for(i=0; i<v; i++) {
    		if(*(s-v+b+i)==*(t+i)) {
    		}
    		else {
    			z=0;
    			break;
    		}
    	}
    
    	if(z==0){
    		return 0;
    	}
    	else {
    		return 1;
    	}
    }
    
    char* strchr (const char *s,int c) {
    	int i, b;
    	char *p;
    
    	b= strlen(s);
    	for(i=b-1; i>=0; i--) {
    		if(*(s+i)==c) {
    		p= (s+i);
    		return p;
    		}
    	}
    
    	return 0;
    }
    
    char* strstr (const char *s,const char *t) {
    	int i, b, g=0, z, v, n;
    	char *p;
    
    	b= strlen(s);
    	v= strlen(t);
    	for(i=b-1; i>=v-1; i--) {
    		if(*(s+i)==*(t+v-1)) {
    			while (g!=v) {
    				if (*(s+i-g)==*(t+v-1-g)) {
    				z=1;
    				g++;
    				}
    				else {
    				g=v;
    				z=0;
    				}
    			}
    			g=0;
    			if (z==1) {
    				n=1;
    				p= (s+i-g-1);
    		}
    		}
    	}
    	if(n==1)
    		return p;
    	else
    		return 0;
    }
    
    int main(){
    
    	char *f1, *f2, *f4, *b, *d;
    	int a, c, laenge;
    
    	f1 = (char *) malloc(laenge*sizeof(char));
    	scanf("%s", f1);
    	f2 = (char *) malloc(laenge*sizeof(char));
    	scanf("%s", f2);
    
    	a= strend(f1,f2);
    	printf("%d\n", a);
    
    	f4 = (char *) malloc(laenge*sizeof(char));
    	scanf("%s", f4);
    	c = *f4;
    	b= strchr(f1,c);
    	printf("%p\n", b);
    
    	d= strstr(f1,f2);
    	printf("%p\n", d);
    
    	free(f1);	
    	free(f2);
    	free(f4);
    
    	return 0;
    }
    


  • int z=1;
    
        if(z==0)
            return 0;
        else
            return 1;
    

    Ist dir mal der Gedanke gekommen, direkt z zurückzugeben?

    Und für die Prüfung kannst du eigentlich auch direkt memcmp nehmen.

    Ich habe mir den Code nicht weiter angeschaut, aber das hier habe ich schon bemerkt:

    f1 = (char *) malloc(laenge*sizeof(char));
    f2 = (char *) malloc(laenge*sizeof(char));
    f4 = (char *) malloc(laenge*sizeof(char));
    

    Erstens: sizeof(char) ist per Definition 1.
    Zweitens: Wann setzt du laenge ? Wo prüfst du, ob malloc dir nur NULL zurückgibt? Wo begrenzt du die Anzahl der Zeichen, die scanf in deinen Speicherbereich schreiben kann? Hast du den Code überhaupt mal laufen lassen? Hast du schon mal was von fgets gehört? Mit was für einem Buch lernst du da programmieren? Ich würde das mal dringend wegwerfen.



  • Freezerr schrieb:

    Habe es mal so aufgebaut was meint ihr dazu?

    Du bindest string.h ein und definierst selbst strstr.
    Das Programm soll laufen?
    Trollen wir ein wenig herum?!
    😉



  • Freezerr schrieb:

    Habe es mal so aufgebaut was meint ihr dazu?
    Also die Aufgabe bestand aus mehreren Teilen also nicht wundern das es so viel ist

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    /* 1. Eingabe: String
       2. Eingabe: String der am ende des 1. String sein soll
    	1.Ausgabe: 1 wenn 2. String am ende steht, 0 wenn nicht
       3. Eingabe: String
       4. Eingabe: Buchstabe, der im 3. String sein soll
    	2.Ausgabe: Pointer, der auf den hintersten 4. Buchstaben im 3. String zeigt
       5. Eingabe: String
       6. Eingabe: String, der im 5. String vorkommen soll
    	3.Ausgabe: Pointer, der auf den vordersten 6. String im 5. String zeigt
    */
    
    int strend (const char *s, const char *t) {
    	int i, b, v, z=1;
    
    	b= strlen(s);
    	v= strlen(t);
    	for(i=0; i<v; i++) {
    		if(*(s-v+b+i)==*(t+i)) {
    		}
    		else {
    			z=0;
    			break;
    		}
    	}
    	
    	if(z==0){
    		return 0;
    	}
    	else {
    		return 1;
    	}
    }
    
    char* strchr (const char *s,int c) {
    	int i, b;
    	char *p;
    
    	b= strlen(s);
    	for(i=b-1; i>=0; i--) {
    		if(*(s+i)==c) {
    		p= (s+i);
    		return p;
    		}
    	}
    	
    	return 0;
    }
    
    char* strstr (const char *s,const char *t) {
    	int i, b, g=0, z, v, n;
    	char *p;
    
    	b= strlen(s);
    	v= strlen(t);
    	for(i=b-1; i>=v-1; i--) {
    		if(*(s+i)==*(t+v-1)) {
    			while (g!=v) {
    				if (*(s+i-g)==*(t+v-1-g)) {
    				z=1;
    				g++;
    				}
    				else {
    				g=v;
    				z=0;
    				}
    			}
    			g=0;
    			if (z==1) {
    				n=1;
    				p= (s+i-g-1);
    		}
    		}
    	}
    	if(n==1)
    		return p;
    	else
    		return 0;
    }
    
    int main(){
    
    	char *f1, *f2, *f4, *b, *d;
    	int a, c, laenge;
    
    	f1 = (char *) malloc(laenge*sizeof(char));
    	scanf("%s", f1);
    	f2 = (char *) malloc(laenge*sizeof(char));
    	scanf("%s", f2);
    
    	a= strend(f1,f2);
    	printf("%d\n", a);
    	
    
    	f4 = (char *) malloc(laenge*sizeof(char));
    	scanf("%s", f4);
    	c = *f4;
    	b= strchr(f1,c);
    	printf("%p\n", b);
    
    	d= strstr(f1,f2);
    	printf("%p\n", d);
    
    	
    	free(f1);	
    	free(f2);
    	free(f4);
    
    	return 0;
    }
    

    Viel zu kompliziert. 😞
    Versuch mal das:

    int endsWith (char *s, char *t)
    {
        int ls = strlen(s);
        int lt = strlen(t);
        if (lt > ls)
            return 0;
        return strcmp(s + ls - lt, t) == 0;
    }
    

    ^^Gibt 1 zurück wenn s auf t endet.



  • Dein strchr ist aber das str r chr aus string.h

    Wenn man durch den String gehen muß, dann geht man nicht über die Länge des Strings, sondern bis zum Ende.

    char* strrchr (const char *s,int c) {
    
       char *p =NULL;         /* Bei Zeigern nimmt man NULL */
    
       while(*s) {            /* solange es nicht das Stringende ist */
         if (*s == c)
            p = s;
         s++;
       } 
       return p;
    }
    

Log in to reply