Stringfunktionen in "C" - Hilfe bei Beispielen

Seite 1 von 2 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/stringfunktionen-in-c-hilfe-bei-beispielen_244615/page_1 - zur Vollversion wechseln!


charmin schrieb am 14.11.2015 um 20:48

Hi!

Wir haben wiedermal ne nette Hausübung in der Abend HTL.

Bring die Funktion einfach nicht zum laufen. Bitte um Hilfe.

Angabe:

click to enlarge


Funktionen:

Code: C
/****************************************************************/
/* strsearch() suchen einer Teilzeichenkette in einer anderen   */
/* Zeichenkette                                                 */
/****************************************************************/
                                               
int strsearch(const char str[], unsigned int maxsearch, const char sstr[])
{
    int i,j,check=0;

    for(i=0;i<=maxsearch;i++)
    {
        // Erst wenn das erste Zeichen zusammenstimmt, dann erst restliche Buchstaben prüfen
        if(sstr[i]==str[i] && sstr[i] !=0 && str[i])
        {
            for(j=1;sstr[j]!= '\n';j++)
            {
                if (sstr[i+j]==str[i+j])
                {
                    check=1;
                } else
                {
                    check=0;
                    break;
                }
            }
        }
        if(check==1)
        {
            break;
        }
    }

    // Wenn Suchwort gefunden, dann melde die Position zurück
    if(check==1)
    {
        return i;
    } else
    {
        return -1;
    }

}


/****************************************************************/
/* strreplace() ersetzen einer Teilzeichenkette in einer        */
/* Zeichenkette                                                 */
/****************************************************************/
int strreplace(char dstr[], unsigned int dstrsize, char sstr[], const char ostr[], const char nstr[])
{
    int i,j,k,check=0;

    for(i=0;i<=dstrsize;i++)
    {
        // Erst wenn das erste Zeichen zusammenstimmt, dann erst restliche Buchstaben prüfen
        if(sstr[i]==ostr[i])
        {
            for(j=1;ostr[j]!= '\0';j++)
            {
                if (sstr[i+j]==ostr[i+j])
                {
                    check=1;
                } else
                {
                    check=0;
                    break;
                }
            }
            if(check==1)
            {
                for(k=0;nstr[k]!='\0';k++)
                {
                    sstr[k]=nstr[k];
                }
                return i;
            } else
            {
                return -1;
            }
        }
    }
}


Aufruf in meiner Main:

Code: C
/****************************************************************/
/* Programmteil strsearch()                                     */
/****************************************************************/

if (iType == 3)
{
		printf("\n\n-----------------------------------------------------------------------------\n");
		printf("|   strsearch() suchen einer Teilzeichenkette in einer anderen Zeichenkette   |\n");
		printf("-----------------------------------------------------------------------------\n\n");
}

char sstr[P]={0},str[P]={0};
int position = 0;

printf("Geben sie bitte einen Text ein, um ihn anschliessend zu durchsuchen:\n\n");

fgets(str,P,stdin);

printf("\n\nWelches Wort bzw Zeichen wollen sie suchen?:\n\n");

fgets(sstr,P,stdin);

position = strsearch(str, P, sstr);

printf("\n\nDas Gesuchte Wort befindet sich an Position %d:\n\n", position);

tia ! :(

Ka obs umständlich gebastelt sind. Bring beide Funktionen nun nach Stunden nicht hin und Montag soll ichs abgeben.


Blaues U-boot schrieb am 14.11.2015 um 21:01

hab jetzt nicht die zeit mir alles anzusehen, aber was mir auf die schnelle aufgefallen ist in strsearch:
im ersten if musst du str[i] mit sstr[0] vergleichen. die restlichen zwei terme brauchst du auch nicht. gültigkeit der strings vor der schleife prüfen. schleife bis maxsearch bzw strlength - sstrlength laufen lassen.

im zweiten if darf i im sstr nicht vorkommen.

in strreplace sind am ersten blick ähnliche fehler.

hth


charmin schrieb am 14.11.2015 um 22:57

sorry, ich weiss, ist etwas viel.
danke für den schnellen input. ich setz mich morgen sowieso wieder hin.


wergor schrieb am 15.11.2015 um 09:18

Code: C
                                               /****************************************************************/
                                               /* strsearch() suchen einer Teilzeichenkette in einer anderen   */
                                               /* Zeichenkette                                                 */
                                               /****************************************************************/
                                               
int strsearch(const char str[], unsigned int maxsearch, const char sstr[])
{
    int i,j,check=0;

    [b]for(i=0;i<maxsearch;i++)[/b]    //hier hattest du einen off-by-one fehler
    {
        // Erst wenn das erste Zeichen zusammenstimmt, dann erst restliche Buchstaben prüfen
        [b]if((str[i] != '\\0') && (str[i] == sstr[0]))[/b]
        {
            [b]for(j=1;sstr[j]!= '\\0';j++)    //strings werden üblicherweise mit '\\0' terminiert[/b]
            {
[b]                if (str[i+j] == '\\0'    //fehlerfall: str zu kurz
                    return -1;[/b]    //die funktion sollte in diesem fall (imho) -1 returnen

                if (str[i+j] == sstr[j])
                {
                    check=1;
                } else
                {
                    check=0;
                    break;
                }
            }
[b]            // Wenn Suchwort gefunden, dann melde die Position zurück
            //damit gibt die funktion die erste gefundene position des sstr zurück
            if (check == 1)
                return i;[/b]
        }
    }

[b]    //wenn sstr nicht gefunden wurde:
    return -1;[/b]
}

in strreplace und strsubstr kannst du einfach strsearch aufrufen, du musst nich alles nochmal implementieren.


mat schrieb am 15.11.2015 um 09:19

Wenn du eine spezielle Frage hast, dann nur her damit. So ist es mir auch etwas zu viel.


charmin schrieb am 15.11.2015 um 10:01

Jawohl. War wohl der verzweiflungsfaktor gestern.
Ich schau in zukunft drauf!

Danke schonmal!
Und danke wergor.


Blaues U-boot schrieb am 15.11.2015 um 10:17

einen tipp kann ich noch geben.
wenn man sich schwer tut mit array(string) indexierung, dann ist es beim lernen einfach mal am besten einen zettel und stift zu nehmen um sich die 2 arrays aufzuzeichnen inkl index.
dann gehst du deinen code durch und vollziehst nach, wie sich der index verändert. dann weißt du wann was mit was verglichen gehört bzw getauscht werden soll und entdeckst die fehler.
mit etwas übung geht das dann in zukunft automatisch.


Obermotz schrieb am 15.11.2015 um 10:23

Die ultimative Referenz fuer Stringmatching-Algorithmen :)
http://www-igm.univ-mlv.fr/~lecroq/string/index.html

// Und der Tipp vom Boot ist auch gut: Aufzeichnen ist in so einem Fall immer die beste Idee!


Denne schrieb am 15.11.2015 um 10:29

Yes! Stift und Papier (gerade am Anfang) sind oftmals super nützlich.


SailorChibi schrieb am 15.11.2015 um 10:48

Aufzeichen und code wirklich schritt für schritt debuggen.

Nichts überspringen! Du musst dir bei jeder Zeile sicher sein, was die macht.

Debugging wird gerade von Anfängern nicht ordentlich ausgenutzt.


Obermotz schrieb am 15.11.2015 um 10:55

Zitat von SailorChibi
Debugging wird gerade von Anfängern nicht ordentlich ausgenutzt.
Stimmt, wird auch oft im Unterricht nicht wirklich gezeigt bzw. angenommen, dass eh klar ist wies funktioniert.


charmin schrieb am 15.11.2015 um 15:44

wurde uns gar nicht gscheid gezeigt. das stimmt. ich spiel mich !

danke


charmin schrieb am 15.11.2015 um 16:37

Falls es jemanden interessiert. nun gehts.
Das oberste check =1 benötige ich, wenn ich nur nen einzelnen Buchstaben eingeb.

Code: C
                                               /****************************************************************/
                                               /* strsearch() suchen einer Teilzeichenkette in einer anderen   */
                                               /* Zeichenkette                                                 */
                                               /****************************************************************/

int strsearch(const char str[], unsigned int maxsearch, const char sstr[])
{
    int i,j,check=0;

    for(i=0;i<maxsearch;i++)
    {
        if(str[i] == sstr[0])
        {
            check=1;
            for(j=1; sstr[j]!='\n';j++)
            {
                if (str[i+j] == '\0')   //fehlerfall: str zu kurz
                {
                    return -1;
                }
                if(str[i+j] == sstr[j])
                {
                    check=1;
                } else
                {
                    check=0;
                    break;
                }
            }

        }
        if(check==1)
        {
            return i+1;
        }
    }
}

Danke für euren input!


Blaues U-boot schrieb am 15.11.2015 um 17:58

wenn nichts gefunden wird, wird kein return aufgerufen.

str[i+j] == '' als fehlerüberprüfung ist unsauber und kann zu segmentation faults führen. besser die länge überprüfen.


charmin schrieb am 15.11.2015 um 18:04

ok return wurde eingefügt. danke. segmentation faults. hnng. muss ich gleich googlen.




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025