"We are back" « oc.at

Stringfunktionen in "C" - Hilfe bei Beispielen

charmin 14.11.2015 - 20:48 3954 22
Posts

Blaues U-boot

blupp, blupp
Avatar
Registered: Aug 2005
Location: Graz
Posts: 1542
str[i+j] kann je nach i und j außerhalb des speicherbereichs von str zugreifen und dann wird entweder irgentein wert der gerade zufällig an der adresse ist ausgelesen oder das OS wirft nen fehler wegen einer speicherzugriffsverletzung (segmentation fault).

charmin

Elder
^_^
Avatar
Registered: Dec 2002
Location: aut_sbg
Posts: 15155
ok checko. danke

11Fire01

Here to stay
Registered: Dec 2002
Location: austria
Posts: 2417
auf den modernen editoren sieht man so manchen segmentation fault gar nicht. dafür wenn man es auf einem pi laufen hat ... und dann alle :D

that

Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11342
Zitat von 11Fire01
auf den modernen editoren sieht man so manchen segmentation fault gar nicht. dafür wenn man es auf einem pi laufen hat ... und dann alle :D

Wenn der Editor segfaulted, dann ist aber der Editor hin und nicht dein Programm. :)

that

Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11342
Zitat von charmin
Falls es jemanden interessiert. nun gehts.

Ich bin leider etwas spät dran, aber das funktioniert ja überhaupt nicht.

Erstens mag der Compiler deine leere Konstante nicht:

Code:
that@ws ~/incoming $ gcc test.c 
test.c: In function ‘strsearch’:
test.c:15:33: error: empty character constant
                 if (str[i+j] == '')   //fehlerfall: str zu kurz
                                 ^

Zweitens funktioniert schon mein einfachster Testfall nicht:

Code:
assert(strsearch("", 3, "a") == -1);

Was genau sollte maxsearch bewirken? Dass nur min(strlen(str), maxsearch) Zeichen durchsucht werden?


Drittens funktioniert mein zweiteinfachster Testfall auch nicht:

Code:
assert(strsearch("abc", 3, "a") == 0);

Steht in der Angabe irgendwo, dass der Suchstring mit "\n" aufhören muss?

Es ist generell hilfreich, zum Testen solcher Funktionen erstmal ein eigenes main() zu schreiben, das einfach nur ein paar konstante Werte an die Funktion übergibt und das Ergebnis mit dem erwarteten Ergebnis vergleicht (z.B. mit dem assert-Makro wie oben). Erstmal schreibt man ein paar Tests für alle Randfälle, die einem so einfallen (leere Strings, gleich lange Strings, Fundstelle am Anfang, in der Mitte, am Ende, nur letztes Zeichen verschieden, Suchstring länger als durchsuchter String, ...), und dann baut man die Funktion so lange um, bis alle Tests korrekt durchlaufen.

11Fire01

Here to stay
Registered: Dec 2002
Location: austria
Posts: 2417
nein, ich meinte, ich hatte einmal ein programm geschrieben. relativ groß in eclipse und es lief im grunde einwandfrei, zumindest im editor. ich habe dann den source code für arm-cpu compiliert und dort zahlreiche segmentation faults gehabt. die ich so unter windows nie hatte. welche mit fgets zu tun hatten.

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25504
Selbst die libc kann je nach Plattform/Compiler sehr unterschiedlich sein, weil das getrennte Implementierungen sind. Außerdem hat ja auch die Hardware bei der Ausführung noch einiges mitzureden. Der Editor/die IDE hilft ja nur bei der Syntax der Programmiersprache und bringt etwaiges Typehinting für Libraries.

that, Unit-Testing mit Assertions? Interessante Vorgehensweise. :)

that

Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11342
Zitat von mat
that, Unit-Testing mit Assertions? Interessante Vorgehensweise. :)

Ein echtes Unittest-Framework ist natürlich bequemer, aber für ganz einfache Tests reicht assert auch, und man muss es nicht erst installieren. :)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz