charmin
Elder^_^
|
Hi! Wir haben wiedermal ne nette Hausübung in der Abend HTL. Bring die Funktion einfach nicht zum laufen. Bitte um Hilfe. Angabe: Funktionen: /****************************************************************/
/* 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: /****************************************************************/
/* 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
|
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^_^
|
sorry, ich weiss, ist etwas viel. danke für den schnellen input. ich setz mich morgen sowieso wieder hin.
|
wergor
connoisseur de mimi
|
/****************************************************************/
/* 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
AdministratorLegends never die
|
Wenn du eine spezielle Frage hast, dann nur her damit. So ist es mir auch etwas zu viel.
|
charmin
Elder^_^
|
Jawohl. War wohl der verzweiflungsfaktor gestern. Ich schau in zukunft drauf!
Danke schonmal! Und danke wergor.
|
Blaues U-boot
blupp, blupp
|
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
|
|
Denne
Here to stay
|
Yes! Stift und Papier (gerade am Anfang) sind oftmals super nützlich.
|
SailorChibi
Addicted
|
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
|
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^_^
|
wurde uns gar nicht gscheid gezeigt. das stimmt. ich spiel mich !
danke
|
charmin
Elder^_^
|
Falls es jemanden interessiert. nun gehts. Das oberste check =1 benötige ich, wenn ich nur nen einzelnen Buchstaben eingeb. /****************************************************************/
/* 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
|
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^_^
|
ok return wurde eingefügt. danke. segmentation faults. hnng. muss ich gleich googlen.
|