Substring... String suchen in String

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

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

    Quellcode

    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:

    Quellcode

    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. }
    Alles anzeigen


    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:

    Quellcode

    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. }
    Alles anzeigen


    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:

    Quellcode

    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:

    Quellcode

    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. }
    Alles anzeigen


    Mfg Rushh0ur