"We are back" « oc.at

Stringfunktionen in "C" - Hilfe bei Beispielen

charmin 14.11.2015 - 20:48 3953 22
Posts

charmin

Elder
^_^
Avatar
Registered: Dec 2002
Location: aut_sbg
Posts: 15068
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.
Bearbeitet von charmin am 14.11.2015, 20:53

Blaues U-boot

blupp, blupp
Avatar
Registered: Aug 2005
Location: Graz
Posts: 1542
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

Elder
^_^
Avatar
Registered: Dec 2002
Location: aut_sbg
Posts: 15068
sorry, ich weiss, ist etwas viel.
danke für den schnellen input. ich setz mich morgen sowieso wieder hin.

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4111
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.
Bearbeitet von wergor am 15.11.2015, 09:22

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25476
Wenn du eine spezielle Frage hast, dann nur her damit. So ist es mir auch etwas zu viel.

charmin

Elder
^_^
Avatar
Registered: Dec 2002
Location: aut_sbg
Posts: 15068
Jawohl. War wohl der verzweiflungsfaktor gestern.
Ich schau in zukunft drauf!

Danke schonmal!
Und danke wergor.

Blaues U-boot

blupp, blupp
Avatar
Registered: Aug 2005
Location: Graz
Posts: 1542
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

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
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

Here to stay
Avatar
Registered: Jan 2005
Location: Germany
Posts: 2801
Yes! Stift und Papier (gerade am Anfang) sind oftmals super nützlich.

SailorChibi

Addicted
Avatar
Registered: Aug 2010
Location: Wien
Posts: 382
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

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
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

Elder
^_^
Avatar
Registered: Dec 2002
Location: aut_sbg
Posts: 15068
wurde uns gar nicht gscheid gezeigt. das stimmt. ich spiel mich !

danke

charmin

Elder
^_^
Avatar
Registered: Dec 2002
Location: aut_sbg
Posts: 15068
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

blupp, blupp
Avatar
Registered: Aug 2005
Location: Graz
Posts: 1542
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

Elder
^_^
Avatar
Registered: Dec 2002
Location: aut_sbg
Posts: 15068
ok return wurde eingefügt. danke. segmentation faults. hnng. muss ich gleich googlen.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz