Gut, über die Lesbarkeit sprechen wir dann, wenn wir die Frage klärt haben, ob es funktioniert.
Funktioniert es?
Was ist der Unterschied zwischen l und j?
Problem mit strstr
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Problem mit strstr
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Problem mit strstr
Funktionieren tut es. Wenn ich für needle z.B. a, aa, z eingebe gibt es den Nullzeiger, ebenso wenn needle länger als haystack ist.
Geb ich für needle ana ein, gibt es anane aus, geb ich ane ein, gibts ane aus.
Es gibt keinen Unterschied zwischen l und j.^^ Hier mal das ganze Programm mit ohne l.
Geb ich für needle ana ein, gibt es anane aus, geb ich ane ein, gibts ane aus.
Es gibt keinen Unterschied zwischen l und j.^^ Hier mal das ganze Programm mit ohne l.

Code: Alles auswählen
char * my_strstr(char *haystack, char *needle);
int main(){
char string[] = "Banane";
char needle[] = "ana";
char *ptr;
ptr = my_strstr(string, needle);
printf(" %s ", ptr);
system("PAUSE");
return 0;
}
char * my_strstr(char *haystack, char *needle){
int hL = strlen(haystack);
int i=0, j=0;
if( strlen(haystack) >= strlen(needle) ){
while(needle[j]){
if(haystack[i+j] == needle[j]){
j++;
continue;
}
i++;
j=0;
if(i == hL){
return 0;
}
} return haystack+i;
}
return 0;
}
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Problem mit strstr
Wenn Du 'a' eingibst bekommst Du den Nullzeiger?do6dm hat geschrieben:Funktionieren tut es. Wenn ich für needle z.B. a, aa, z eingebe gibt es den Nullzeiger, ebenso wenn needle länger als haystack ist.
Unerwartet, aber interessant.
Klingt gut, dann verstehe ich den Code nicht.do6dm hat geschrieben:Geb ich für needle ana ein, gibt es anane aus, geb ich ane ein, gibts ane aus.
Bitte formatiere den Code mal halbwegs sinnvoll:
Das gilt für alle kommenden Quelltexte.
Code: Alles auswählen
char * my_strstr(char *haystack, char *needle);
int main()
{
char string[] = "Banane";
char needle[] = "ana";
char *ptr;
ptr = my_strstr(string, needle);
printf(" %s ", ptr);
system("PAUSE");
return 0;
}
char * my_strstr(char *haystack, char *needle)
{
int hL = strlen(haystack);
int i=0, j=0;
if( strlen(haystack) >= strlen(needle) ) // <- hier kannst Du hL nehmen!
{
while(needle[j])
{
if(haystack[i+j] == needle[j])
{
j++;
continue;
}
i++;
j=0;
if(i == hL)
{
return 0;
}
}
return haystack+i;
}
return 0;
}
Der Aufbau ist ... ungewöhnlich, die meisten gehen den Heuhaufen ab, ob sie die Nadel finden, Du vergleichst die Nadel solange mit dem Heuhaufen, bis die vollständige Nadel mit einem Halm übereinstimmt oder jeder Halm verglichen wurde. Das geht natürlich auch.
Interessant ist Deine Mischung aus Arrayzugriffen und Pointerarithmetik (haystack+i). Ersteres ist allgemein als besser lesbar angesehen (&haystack), Pointerarithmetik ist schneller.
Ansonsten ist Code soweit in Ordnung. Trotzdem zwei Anregungen:
Code: Alles auswählen
i++;
j=0;
if(i == hL)
{
return 0;
}
Code: Alles auswählen
while(needle[j])
{
if(haystack[i+j] == needle[j])
Und natürlich die doppelte Bestimmung von strlen( haystack ).
Wenn Du Bock hast, schreib die Routine neu ohne Indizes, nur mit Pointerarithmetik. Also kein i, kein j, nur Pointer. Das ist dann eigentlich schon die Königsdisziplin.
Fang mit i an. Statt i um eins zu erhöhen, addiere haystack um 1. Haystack ist nur ein Zeiger, der in diese Funktion kopiert wurde. Addierst Du ihn um 1, zeigt er auf das nächste Char.
Die Funktion würde ich Dir so - wenn sie sauber formatiert ist - mit den Hinweisen abnehmen. Das ist als Übung in Ordnung - solange Du bei 'a' keinen Nullzeiger bekommst...
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Problem mit strstr
Sorry, da hab ich mich vertan. Bei a bekomm ich natürlich anane als Ausgabe.
Wie immer, vielen Dank für deine Hilfe!
Neu schreiben kann ich jetzt aus Zeitgründen grad nicht. Hab morgen schon die Klausur.
Mal ne allgemeine Frage, was ist ein postfix und ein präfix argument, bzw. der Unterschied?
Wie immer, vielen Dank für deine Hilfe!
Neu schreiben kann ich jetzt aus Zeitgründen grad nicht. Hab morgen schon die Klausur.
Mal ne allgemeine Frage, was ist ein postfix und ein präfix argument, bzw. der Unterschied?
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Problem mit strstr
Das verwendet man üblicherweise bei unären Operatoren (Operatoren, die nur ein Argument haben)do6dm hat geschrieben:Sorry, da hab ich mich vertan. Bei a bekomm ich natürlich anane als Ausgabe.
Wie immer, vielen Dank für deine Hilfe!
Neu schreiben kann ich jetzt aus Zeitgründen grad nicht. Hab morgen schon die Klausur.
Mal ne allgemeine Frage, was ist ein postfix und ein präfix argument, bzw. der Unterschied?
Prä ist "Vor", Post ist "Nach". Ein Präfix-Operator ist zum Beispiel "-" für den Vorzeichenwechsel des nachfolgenden: -9.
C kennt vorrangig Prefix-Operatoren: &var, *var, !var.
Postfix ist hinter den Operanden. Beispiel in C weiß ich gerade mal nicht... müsste es auch nicht geben außer
++ und --, welche es in beiden Varianten gibt:
i++ oder ++i.
Der Unterschied ist die Rückgabe:
Wenn i = 1 ist, dann rechnet ++i zuerst und gibt dann das Ergebnis 2 zurück.
Wenn i = 1 ist, dann speichert i++ erst den Wert von i und erhöht i danach. Das gespeicherte Ergebnis 1 wird zurückgegeben.
i++ kann entsprechend aufwendiger sein als ++i. In C sind beide gleich schnell, in C++ kann es einen Unterschied machen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.