Eigene Funktion zur Stringmanipulation schreiben
-
Hallo Forengemeinde!
Ich hoffe ihr könnt mir helfen. Ich möchte gerne eine Funktion schreiben der ich einen String übergebe, diese verändert den und gibt ihn wieder zurück.
Die Funktion vokale() im folgendem Quelltext soll alle Vokale in dem Char-Array wohnort durch Sternchen ersetzen. Der Inhalt der Funktion funktioniert soweit. Allerdings scheint es ein Problem bei der Übergabe zu geben. Ich bin mir auch nicht sicher welche Datentypen für die Funktion nötig sind. Ich habe char* genommen.
#include <stdio.h>
#include <string.h>char* vokale(char* wohnort)
{
int anz, i;
anz = strlen(wohnort);
i = 0;
while (i<anz)
{
if(wohnort[i]==65 || wohnort[i]==69 || wohnort[i]==73 || wohnort[i]==79 ||
wohnort[i]==85 || wohnort[i]==97 || wohnort[i]==101 || wohnort[i]==105 ||
wohnort[i]==111 || wohnort[i]==117) //A,E,I,O,U,a,e,i,o,u
wohnort[i]=42; //42 entspricht *
i++;
}return(wohnort);
}int main(void)
{
char wohnort[50];printf("Geben Sie PLZ und Stadt ein: ");
gets(wohnort);
printf(" Wohnort: %s\n\n",wohnort);printf("Der String mit Sternchen:\n");
wohnort = vokale(wohnort);printf("\n\nString:%s\n",wohnort);
return 0;
}Ich compiliere das ganze mit MS Visual C++. Er meckert an der Stelle: wohnort = vokale(wohnort);
Und sagt: Linker Operand muss ein L-Wert sein.Ich werde nicht so ganz Schlau aus der Meldung.
MfG
Martin
-
vokale(char* wohnort) braucht keinen Rückgabewert. mach einfach anstatt "char *" nen void. Die Funktionen verändert dein har Array aus main(), daher ist es quatsch, buffer = vokale(buffer); zu verwenden.
-
YEAH! Vielen Dank!!!!
Es funktioniert, so ist es sogar noch besser ohne dieses "buffer = vokale(buffer);".#include <stdio.h> #include <string.h> void vokale(char* wohnort) { int anz, i; anz = strlen(wohnort); i = 0; while (i<anz) { if(wohnort[i]==65 || wohnort[i]==69 || wohnort[i]==73 || wohnort[i]==79 || wohnort[i]==85 || wohnort[i]==97 || wohnort[i]==101 || wohnort[i]==105 || wohnort[i]==111 || wohnort[i]==117) //A,E,I,O,U,a,e,i,o,u wohnort[i]=42; //42 entspricht * i++; } } int main(void) { char wohnort[50]; printf("Geben Sie PLZ und Stadt ein: "); gets(wohnort); printf(" Wohnort: %s\n\n",wohnort); printf("Der String mit Sternchen:\n"); vokale(wohnort); printf("\n\nString:%s\n",wohnort); return 0; }
Danke!
MfG
Martin
-
gets() ist nicht gut. Es ist sogar richtig böse. man: fgets ist vieeeel besser.
Und noch eine kleine Anregung wie ich die Funktion vokale() gebaut hätte:
void vokale(char* wohnort){ while( (wohnort=strpbrk(wohnort,"AEIOUaeiou")) ) { *wohnort = '*'; } }
Find ich doch lesbarer
Außerdem ist es nicht gut den Dezimalwert für Buchstaben/Zeichen zu benutzten. Besser als 65 ist definitiv 'A'
-
Hi Tactx!
Danke für die Tipps! Das mit fgets werde ich mir merken. Allerdings verlangt in diesem Fall die Aufgabenstellung, dass ich gets beuntze.
Deine Funktion ist echt noch viel lesbarer als meine und sie funktioniert sogar.
Das Problem ist nur, ich muss sie verstehen und dazu hätte ich einige Fragen:
Warum verwendet man in der Bedingung der While-Schleife eine Zuweisung und nicht einen Vergleichsoperator?
Und wieso muss der * vor wohnort?*wohnort = '*';
Ich habe mittlerweile soviel mitbekommen, das der Stern für einen Zeiger steht. Ich habe aber noch nie mit Zeigern gearbeitet.
Ahhhh, ich habs vielleicht. Ich versuche es mal mit meinen eigenen Worten zu beschreiben:
strpbrk(wohnort,"AEIOUaeiou") liefert einen Zeiger zurück, der auf dem ersten Vorkommen von A,E,I,O,U,a,e,i,o oder u im String wohnort zeigt. Dieser Zeiger wird wohnort zugewiesen und mit *wohnort kann man auf die Stelle zugreifen, auf der der Zeiger gerade steht.
Ist das soweit richtig?
Ich verstehe nur nicht wie die Bedingung der While-Schleife unwahr werden kann.MfG
Martin
-
themaddin schrieb:
Deine Funktion ist echt noch viel lesbarer als meine und sie funktioniert sogar.
Frech
themaddin schrieb:
Ahhhh, ich habs vielleicht. Ich versuche es mal mit meinen eigenen Worten zu beschreiben:
strpbrk(wohnort,"AEIOUaeiou") liefert einen Zeiger zurück, der auf dem ersten Vorkommen von A,E,I,O,U,a,e,i,o oder u im String wohnort zeigt. Dieser Zeiger wird wohnort zugewiesen und mit *wohnort kann man auf die Stelle zugreifen, auf der der Zeiger gerade steht.
Ist das soweit richtig?Vollkommen richtig.
themaddin schrieb:
Ich verstehe nur nicht wie die Bedingung der While-Schleife unwahr werden kann.
Sie wird unwahr wenn strpbrk() keines der Zeichen aus "AEIOUaeiou" mehr in dem String findet. Dann wird NULL zurückgegeben, was einfach false ist.
PS: Du hast schon mit Zeigern gearbeitet. Hint: foo[i] ist gleichbedeutend mit *(foo + i)
-
Hi TactX!
Ok, dann habe ich das soweit verstanden und kann es auch erklären.
Ich habe aber noch eine Frage: Ich soll für die Ausgabe die Funktion puts() benutzen. Kann man mit Puts auch Variablen und Text in einer Zeile ausgeben?
Ich habe bisher nur gesehen, dass man entweder eine Variable oder Text ausgeben kann.
Ich habe es so gelöst:strcpy(alles, " Strasse und Hausnummer: "); strcat(alles, strasse); strcat(alles, "\n"); puts(alles);
Kann man das noch vereinfachen?
Die Ausgabe soll qausi dem entsprechen:printf(" Strasse und Hausnummer: %s\n\n",strasse);
MfG
Martin
-
themaddin schrieb:
Ich habe aber noch eine Frage: Ich soll für die Ausgabe die Funktion puts() benutzen.
Du darfst also kein printf() für Ausgabe verwenden? Dämliche Aufgabenstellung. Ich würde das mit man: sprintf umgehen
-
TactX schrieb:
Du darfst also kein printf() für Ausgabe verwenden? Dämliche Aufgabenstellung. Ich würde das mit man: sprintf umgehen
du kannst ja so richtig fies sein
-
Hi!
sprintf(alles," Strasse und Hausnummer: %s\n\n",strasse); puts(alles);
Danke für den Tipp!!!
Mein Programm wird immer kleiner.
du kannst ja so richtig fies sein
Was ist daran fies?
MfG
Martin