PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Punktuationszeichen im Satz löschen



Katya
11-06-2005, 16:41
Ich habe folgende Hausaufgabe gekriegt:

Die Lösung soll als Funktion geschrieben werden, der die Strings als Pointer übergeben werden. Es dürfen keine string-Systemfunktionen verwendet werden.

liest einen Satz ein und löscht alle Punktuationszeichen außer dem Satzende Zeichen. Hintereinander folgende Leerzeichen sollen auf ein Lerrzeichen reduziert werden.
int clean(char *str,char *ergebnis)


Hier ist das, was ich bis jetzt geschafft habe

#include <stdio.h>
#include <string.h>
#define MAX 132

char buffer[MAX];
int main ()
{
char ergebnis;
printf("Geben Sie bitte einen Satz ein>>>\n");
fgets(buffer,MAX,stdin);
ergebnis = neuer_satz (ergebnis);
printf("%s\n",ergebnis);
}



int neuer_satz()
{
char *ergebnis;
char *str;
str = &buffer[0];
int i;
while (*str)
{
if((*str>34&&*str<48)||(*str>58&&*str<63)&&*str!=46)
{
*str=*str[i+1];
}
else
{
*ergebnis=*str;
str++;
ergebnis++;
}
}
}


Kann mir bitte jemand erklären, wo hier die Fehler sind, und was hier falsch ist.

Danke

locus vivendi
11-06-2005, 18:49
Da ist gleich mehreres falsch. Gehen wir mal davon aus, dass das Programm kompilieren würde. Dann würde es undefiniertes Verhalten herbeiführen. Du verwendest in "neuer_satz" nämlich die uninitialisierte Variable i, um deinen Puffer zu indizieren. Was dann passieren soll, darüber machen C oder C++ überhaupt keine Aussage. Es kann also *alles* passieren. Zweitens verwendest du potentiell auch noch die Variable "ergebnis" ohne sie zu initialisieren. Also ebenfalls, "undefiniertes Verhalten". Möglicherweise ist da auch noch mehr.

Das Programm kompilliert aber nicht. Folgendes konnte ich auf die Schnelle sehen:
Du solltest dir erstens nochmal anschauen, wie die Funktion "neuer_satz" deklariert ist, und wie du sie aufzurufen versuchst. Zweitens können unter Umständen Zeichen in der Eingabe so hintereinander vorkommen, dass "str" nicht mehr inkrementiert wird. Die For-Schleife kann also unter umständen niemals abbrechen. Außerdem "weiss" das Programm an der Stelle an der du "neuer_satz" aufrufst, noch überhaupt gar nicht, dass so eine Funktion überhaupt existiert. Du müsstest diese Funktion entweder vor main setzen, oder eine Funktionsdeklaration vor main angeben.

Bevor du jetzt anfängst die Fehler auszubessern, ich hätte ein paar Sachen von denen ich glaube, dass sie dir helfen könnten:
Ich würde erst mal eine Art "Dummy" Program machen, welches sich um die Eingabe kümmert, und schon das Gerüst für die Unterfunktionen enthält. Schreibe dazu immer kleine Teile, und prüfe ob sie kompilieren. So kannst du vermeiden, dass du immer mehr Teile schreibst, die auf Code aufbauen, der gar nicht kompiliert. Dann mach dich an die Implementierung der eigentlichen Logik. Gehe wieder in kleinen Schritten vor. Vielleicht ist es das Beste, wenn du die Eingabe unverändert lässt, und die Ausgabe in einen zweiten Puffer schreibst. Dass hindert dich vielleicht daran, mit der Indizierung durcheinander zu kommen. Wenn dein Programm abstürzt, oder sich niemals beendet, dann versuche erstmal, das zu beheben, und kümmer dich vorerst nicht darum, auch wirklich Zeichen auszufiltern.

Ich hoffe, dass dir das hilft, ich kann es natürlich nicht garantieren, vielleicht liege ich auch daneben.

Noch etwas dazu wie, du die hier gepostet hast. Es ist eigentlich immer besser, wenn du genau sagst, *was* nicht funktioniert. Hier also, dass das Programm nicht kompiliert. Dann solltest du dazu auch noch die Ausgaben des Compiliers angeben. Das hilft den Leuten, die das lesen, normalerweise bei der Fehlersuche. Hier konnte ich auch einige Dinge sofort sehen, ohne dass mir es der Compiler sagen müsste. Aber wenn ich nichts auf die Schnelle sehen kann, dann mache ich mir nicht mehr die Mühe, erstmal rauszufinden, was eigentlich falsch läuft. Und vielleicht gilt das auch für andere Leute die hier lesen. Außerdem wäre es ganz nett, wenn du sagst, welche Programmiersprache es genau ist. Dein Code kann nämlich sowohl C, als auch C++ sein. Und manchmal macht das einen Unterschied für die möglichen Antworten.