Zeichen in Zeichenkette (Funktion)

Hallo Leute.

Aufgabenstellung: Schreiben Sie eine Funktion, die feststellt an welcher Stelle einer Zeichenkette ein Zeichen zum letzten Mal vorkommt. Die Stellennummer, an der das Zeichen zum letzten Mal vorkommt soll der Rückgabewert der Funktion sein. Ist das Zeichen in der Zeichenkette nicht vorhanden oder wird keine gültige Zeichenkette übergeben, soll der Wert -1 zurückgeliefert werden.

So also ich habe mein Programm geschrieben bekomme aber immer eine Fehlermeldung. Ich würde mich freuen, wenn ihr mir weiterhelfen könntet.

/*
haupt.c

Hauptprogramm zu dem Projekt: Zeichenkette

*/

#include

#include „zeichen.h“

int main (void)

{
char z[80]; /* Das Feld(array) vom Typ char für die Zeichenkette wird definiert*/

char v[2]; /* Zeichen */

int i,n;

printf(„Bitte geben Sie ihre Zeichenkette ein:\n\n“ , z);

gets(z); /* Liest die Zeichenkette einschließlich der Leerzeichen ein*/

printf("\n");

printf(„Bitte geben Sie das Zeichen ein:\n\n“);

gets(v);

i = EdZ ( i , z );

n = Zn ( i , n , z , v );

printf("\n");

printf(„Das Zeichen %c kommt zu letzt an der Stelle %d vor \n“ , v[0] , n); /* Ausgabe auf dem Bildschirm */

return 0;
}

/*
zeichen.h

Schnittstelle
*/

extern int Edz ( int i , char z );
extern int ZN ( int i , int n , char z , char v );

/*
Zeichensuche.c

Funktion zur Zeichensuche
*/

#include

int EdZ ( int i , char z )
{
for ( i=0 ; z[i]!=’\0’ ; i++); /* Mit Hilfe dieser Schleife wird die Länge der Zeichenkette ermittelt*/
return i;
}

int Zn ( int i , int n , char z , char v )
{
for ( n=i-1 ; z[n]!= v[0] ; n–); /* Das Programm durchläuft von hinten die Zeichenkette und sucht nach dem Zeichen */

n++;

return n;
}

Ich weiß das ist was lang und es tut mir Leid.

Mfg Mr T!

Hallo Mr T,

kannst du die Fehlermeldung bitte nächstes Mal mit reinschreiben.

2 Fehler habe ich gefunden, die sich an mehreren Stellen auswirken.

  1. Groß und Kleinschreibung müssen immer gleichbleiben. Du schreibst die Funktionsnamen immer z.T. unterschiedlich. (mal EdZ, mal Edz; mal ZN mal Zn)

  2. Wenn du ein char Array übergeben willst, must du als Parameter char * angeben und nicht nur einfach char

Hoffe das hilft dir weiter

Gruß Sabst

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Mr T,

Aufgabenstellung: Schreiben Sie eine
Funktion, die feststellt an welcher Stelle einer Zeichenkette
ein Zeichen zum letzten Mal vorkommt. Die Stellennummer, an
der das Zeichen zum letzten Mal vorkommt soll der Rückgabewert
der Funktion sein. Ist das Zeichen in der Zeichenkette nicht
vorhanden oder wird keine gültige Zeichenkette übergeben, soll
der Wert -1 zurückgeliefert werden.

Ahh, Hausaufgabenhilfe :wink:

So also ich habe mein Programm geschrieben

Prima!

bekomme aber immer eine Fehlermeldung. Ich würde mich
freuen, wenn ihr mir weiterhelfen könntet.

Was du gemacht hast, ist schon ganz ok. für
einen Einsteiger. Wie Sabst schon schrub,
sind da noch einige Ungereimtheiten drin.

Ich hab mal den Quelltext mit minimalen Änderungen
versehen, so dass er läuft. Ausserdem habe ich
die Variablen- und Funktionsbezeichnungen „etwas“
lesbarer gestaltet. Vielleicht gehst Du mal
Schritt für Schritt durch und stellst dann
die Fragen zu den einzelnen Aspekten.

main.c

/\* haupt.c
 Hauptprogramm zu dem Projekt: Zeichenkette \*/

 #include "zeichen.h"
 #include 

 int main (void)
{
 char zeichenkette[256]; /\* Das Feld vom Typ char[] fuer Zeichenkette \*/
 char zeichen; /\* Zeichen \*/
 int laenge, index;

 printf("Bitte geben Sie ihre Zeichenkette ein:\n");
 fgets(zeichenkette, sizeof(zeichenkette), stdin); /\* Liest Zeichenkette ein \*/
 printf("Bitte geben Sie das Zeichen ein:");
 zeichen = getchar();

 laenge = Zeichenkettenlaenge(zeichenkette);
 index = LetzterIndexVonIn(zeichen, zeichenkette, laenge);

 if(index != -1) /\* Ausgabe auf dem Bildschirm \*/
 printf("\n'%c' kommt zuletzt an index %d vor!\n", zeichen, index); 
 else
 printf("\n%c kommt gar nicht vor!\n", zeichen); 

 return 0;
}

zeichen.h

/\* zeichen.h
 Schnittstelle \*/

 int Zeichenkettenlaenge(char\* z);
 int LetzterIndexVonIn(char c, char \*z, int laenge);

zeichen.c

/\* Zeichensuche.c
 Funktion zur Zeichensuche \*/
 #include "zeichen.h"

 int Zeichenkettenlaenge(char\* z)
{
 int i;
 for(i=0; z[i]!='\0'; i++) /\* Mit Hilfe dieser Schleife \*/
 ; /\* wird die Laenge der \*/
 /\* Zeichenkette ermittelt \*/
 return i; /\* Rueckgabe: letzer Index bei \0 \*/
}

 int LetzterIndexVonIn(char c, char \*z, int laenge)
{
 for( ; laenge\>=0; laenge--)/\* Das Programm durchlaeuft von \*/
 if( z[laenge] == c ) /\* hinten die Zeichenkette (ab \0) \*/
 return laenge; /\* und sucht nach dem Zeichen c \*/

 return -1; /\* Rueckgabe: -1 fuer "nicht gefunden" \*/
}

Wenn Du hier Quelltexte postest,
solltest Du diese in
pre>

 ...
 mein Quelltext
 hier ...
 ...

/pre>
Tags einrahmen.

Grüße

CMБ

Hallo Mr T,

kannst du die Fehlermeldung bitte nächstes Mal mit
reinschreiben.

2 Fehler habe ich gefunden, die sich an mehreren Stellen
auswirken.

  1. Groß und Kleinschreibung müssen immer gleichbleiben. Du
    schreibst die Funktionsnamen immer z.T. unterschiedlich. (mal
    EdZ, mal Edz; mal ZN mal Zn)

  2. Wenn du ein char Array übergeben willst, must du als
    Parameter char * angeben und nicht nur einfach char

Hoffe das hilft dir weiter

Gruß Sabst

Hi Sabst.

Vielen Dank für deine Hilfe. Du hattest Recht es lag an diesen Fehlern. Tja 4 Augen sehen mehr als 2. Es läuft jetzt wie ne Eins und danke für den Tipp mit den * , dass wusste ich nicht.

Semjon Michailowitsch. Dir auch ein Dankeschön für dein Programm, aber ich nehme lieber meins, da verstehe ich auch besser wie es funktioniert und ich habe es selber geschrieben.

Mfg Mr T

Hallo

warum durchläufst du die Zeichenkette nicht nur einmal von vorne?

int findeLetztesVorkommen(char\* zeichenkette, char zeichen)
{
 int ret = -1; // wenn nichts gefunden, gib -1 zurück
 int iter = 0; 

 while ( zeichenkette[iter] ) // das '\0' am Ende der Zeichenkette beendet die Schleife
 {
 // Wenn das gesuchte Zeichen gefunden wird, wird der 
 // Rückgabewert auf diese Stelle gesetzt.
 // da die Zeichenkette bis zum Ende durchlaufen wird,
 // steht dann die Stelle vom letzten vorkommenden Zeichen drin.
 // Wenn nichts gefunden wird, dann bleibt der Wert der Initialisierung
 if (zeichenkette[iter] == zeichen ) 
 ret = iter;
 iter ++;
 }
 return ret;

Grüße.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]