Substring... String suchen in String

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • Substring... String suchen in String

    Hallo C Freunde!

    Ich versuche gerade eine Funktion in C zu schreiben die in String1 nach String2 sucht und dessen Anfangsposition ausgibt.

    also zum Beispiel:

    Source Code

    1. char a[] ={"C ist cool"};
    2. char b[]={"ist cool"};
    3. suche(a,b);


    Ich weiß das es dafür bereits eine vorgefertigte Funktion in c gibt allerdings darf ich die laut Aufgabenstellung nicht benutzen!!

    also was ich bereits habe ist folgendes:

    Source Code

    1. int substr (const char* str1, const char* str2);
    2. int strlaenge(const char* str);
    3. char ausgabe(char* str);
    4. int substr (const char* str1, const char* str2)
    5. {
    6. int i;
    7. int k;
    8. int c=0;
    9. char* b = (char*)malloc(sizeof(char));
    10. for(i=0; i<strlaenge(str2);i++)
    11. {
    12. for(k=0; strlaenge(str1); k++)
    13. {
    14. if(str2[i]==str1[k])
    15. {
    16. b[code=c]=str1[i];
    17. c++;
    18. }
    19. }
    20. }
    21. }
    Display All


    strlaenge liefert mir die Länge des Strings zurück und Funktioniert auch.

    Mein Problem ist einfach die Funktion substr da ich keine ahnung habe wie ich das ganze machen soll.

    Ich muss ja praktisch beide Strings durchlaufen und jeden Buchstaben mit einander vergleichen. Dann speicher ich jeden Gleichen Buchstaben wieder in ein Hilfarray und vergleiche dieses dann mit dem String den ich suche. Womit ich praktisch wieder am Anfang stehe also schwachsinn. Ich scheiter einfach an der Tatsache das ich einen zusammenhängenden String suche.

    Ich hoffe ihr könnt mir helfen ich weiß meine Erklärung war nicht so gut ist aber auch schwer per Forum zu erklären:
  • Also ich würde zuerst die Länge bei der Strings ermitteln.
    Falls die Länge des Suchstrings größer ist als der Länger in dem gesucht werden soll, kann die Funktion direkt beendet werden.

    Um die Strings dann anschliessend zu vergleichgen würde ich zwei Variablen nehmen, eine Laufvariable und eine zweite in der Ich speichere wie viele zeichen übereingestimmt haben,
    sobald ein Zeichen nicht übereinstimmt wird letzteres zurückgesetzt und wenn die Länger der überingestimmter Zeichen der Länge des Suchstrings entspricht hat man diesen gefunden.

    Mfg Rushh0ur
  • Hallo Rushhour!

    Danke für deine Antwort! Dein Ansatz hat mir schon sehr weitergeholfen ... nur leider klappt es noch nicht so ganz.

    Also ich habe nun folgendes gemacht:

    Source Code

    1. int substr (const char* str1, const char* str2)
    2. {
    3. int i;
    4. int j=0;
    5. int size1;
    6. int size2;
    7. int h=0;
    8. char* hilf = (char*)malloc(sizeof(char));
    9. size1= strlaenge(str1);
    10. size2= strlaenge(str2);
    11. if(size2 > size1)
    12. {
    13. fprintf(stderr,"nicht gefunden der String ist zu Lang\n");
    14. return -1;
    15. }
    16. for(i=0; i<size1; i++)
    17. {
    18. if(str1[i] == str2[j])
    19. {
    20. hilf[h]=str1[i];
    21. h++;
    22. j++;
    23. if(str1[i+1] != str2[j+1])
    24. {
    25. printf("Fehler\n");
    26. h=0;
    27. j=0;
    28. }
    29. }
    30. }
    31. if(strlaenge(str2)==strlaenge(hilf))
    32. {
    33. printf("gefunden\n");
    34. printf("Laenge String2: %i\n", strlaenge(str2));
    35. printf("Laenge Hilfstring: %i\n", strlaenge(hilf));
    36. }
    37. }
    Display All


    Zur erklärung ich suche zuerst den Anfangsbuchstaben des Suchstrings wenn dieser Gefunden ist schreibe ich diesen in ein Hilfsarray als nächstes überprüfe ich ob die Folge Buchstaben auch gleich sind falls nicht muss ich das Array(bzw wird das Array wieder von neuem Überschrieben) sowie die Variable j mit der ich den suchstring durchlaufe zurücksetzen.
    Nur leider wird das Programm sofort beendet wenn ich in folgende If Abfrage laufe:

    Source Code

    1. if(str1[i+1] != str2[j+1])
    2. {
    3. printf("Fehler\n");
    4. h=0;
    5. j=0;
    6. }


    Nur warum???
  • Warum so komplitziert? Du brauchst doch gar keinen weiteren Puffer.

    Schau mal, so könnte es aussehen:

    Source Code

    1. int strlaenge(const char *str)
    2. {
    3. if (!str) return 0;
    4. char *ptr = (char*)str;
    5. while (*++ptr);
    6. return (ptr-str);
    7. }
    8. int substr (const char* str1, const char* str2)
    9. {
    10. if (!str1 || !str2) return 0;
    11. int len1 = strlaenge(str1);
    12. int len2 = strlaenge(str2);
    13. if (!len1 || !len2 || len1 < len2) return 0;
    14. int p2 = 0;
    15. for (int p1=0; p1<len1; ++p1)
    16. {
    17. if (str1[p1] == str2[p2])
    18. {
    19. ++p2;
    20. if (p2 == len2)
    21. return (p1-1);
    22. }
    23. else
    24. p2 = 0;
    25. }
    26. return 0;
    27. }
    Display All


    Mfg Rushh0ur