Zeichen in einer Zeichenkette zählen C#
-
Also Jungs, Teilaufgabe a.) hab ich geschafft.
Siehe Code:#include <stdio.h> #include <string.h> #include <Windows.h> void main() { char wort[50]; char buchstabe; int i, anzahl=0; printf("Bitte ein Wort eingeben: "); scanf("%s", wort); printf("\nBitte einen Buchstaben eingeben: "); scanf(" %c",&buchstabe); for (i = 0; i<50; i++) { if (wort[i] == buchstabe) anzahl = anzahl+1; } printf("\nDer Buchstabe %c kommt im Wort %d mal vor.\n", buchstabe, anzahl); system("PAUSE"); }
Vielen Dank für eure Hilfe bis hier hin.
Jetzt zur Teilaufgabe b.) Mit Hilfe eines Pointers.
Könnt ihr mir ein Denkantritt geben?
MfG
-
Ups, zu langsam.
Benjoo #1 schrieb:
Edit2:
Wenn ich, wie von SeppJ gesagt, " %c" schreibe, funktioniert es, aber den Grund habe ich nicht richtig verstanden?Das was du da scanf als ersten Parameter übergibst ist der Formatstring.
Daran erkennt scanf was für Eingaben du erwartest.
Das Leerzeichen bedeutet: Überlese alle Whitespace (Leerzeichen, Tabulatoren Newline, CarriageReturn).Warum ist das nötig? Von der Eingabe für wort bleibt die Entertaste noch im Eingabestrom stehen. Die wird von scanf nicht eingelesen.
Normalerweise überliest scanf die Whitespace auch, aber gerade nicht bei %c, denn du könntest ja genau die Taste einlesen wollen.
Es gibt noch andere Funktionen zum einlesen. Z.B: getchar
-
Benjoo #1 schrieb:
Könnt ihr mir ein Denkantritt geben?
Was weißt du denn alles über Pointerarithmetik? Du brauchst nicht viel. Falls du nichts darüber weißt, hast du nun ein Stichwort.
Dein Programm ist übrigens falsch. Was passiert denn, wenn das Wort weniger als 50 Zeichen hat? Du hast bloß Pech, dass dein Programm bei deinen Testfällen zufällig funktioniert hat, daher hast du den Fehler nicht bemerkt.
-
Das Ende eines Strings erkennt man an dem '\n' Zeichen.
Stell mal deine for-Schleife darauf um.Für b) brauchst du erstmal einen Zeiger, der auf wort zeigt.
Solange das Zeichen auf das der Zeiger zeigt != '\0' ist kannst du weiter machen.
Am Ende der Schleife musst da dann noch den Zeiger weiterzählen.Lösung gibt es nicht, nur Verbesserungen
-
DirkB meint übrigens '\0', nicht '\n'.
-
Hmm, ich weiß nicht so Recht wie ich das verbessern soll, eigentlich wollte ich auch nicht 50 reinschreiben, sondern das so machen, dass das Array immer die Anzahl der Elemente hat, wie lang das Wort nun ist, bzw. ein Element mehr. Wusste aber nicht wie das geht.
Wenns um Pointer geht bin ich noch nicht soo fit.. Bin gerade ziemlich Ahnungslos..
MfG
-
Na irgend etwas wirst du ja schon von Zeigern gehört haben.
Weißt du wie man an die Adresse einer Variablen kommt?
Weißt du wie man an den Wert kommt, auf den der Zeiger zeigt?
-
Ja die Adresse einer Variablen bekomme ich durch &, wenn ich mich richtig erinnere.
Bsp. &s liefert die Adresse der Variablen s.
Richtig soweit?
-
Im Prinzip ja.
Und wie kommst du an den Inhalt an der Adresse?
-
Ja wenn ich einen Zeiger habe namens Bsp. ptr_a mache ich:
*prt_a = &s;
y = *ptr_a;
Wenn jetzt s=4 ist, zeigt ptr_a auf 4 und y wird der Wert zugewiesen.
-
Soweit so gut. Jetzt noch der große Trick:
int foo[2] = {1,2}; int *ptr = &foo[0]; ptr = ptr + 1; int y = *ptr; // Welchen Wert hat y?
-
2? bzw. foo[1]
-
Benjoo #1 schrieb:
2? bzw. foo[1]
Genau. Und mit diesen drei Zutaten (Adressoperator, Addition von Zahlen zu Pointern und '\0' als Ende von Zeichenketten), die DirkB und ich dir gezeigt haben, fällt dir da eine Möglichkeit ein, mittels eines Pointers zeichenweise durch eine Zeichenkette zu laufen?
-
Hmm, ich steh total aufm Schlauch momentan...
-
Erst nochmal mit Array:
for (i = 0; wort[i] != '\0'; i++) // i<50 ersetzt. { if (wort[i] == buchstabe) anzahl = anzahl+1; }
Du brauchst einen Zeiger auf das Array
char *p; ... p = wort; // bei eienem Array kein &
Beim Vergleich greifst du dann auf das Element mit * zu:
*p != '\0';
Und dann musst du noch den Zeiger weiterzählen
p++
Dann schaust du mal wo das oben hinpassen könnte. (das i brauchst du dann nicht mehr)
-
for (p = wort; *p != '\0'; p++) { if (*p == buchstabe) anzahl = anzahl+1; }
Soweit richtig?
Danke auf jeden Fall, ward mir ne sehr große Hilfe!
-
Prima.
Statt*p != '\0'
kann man auch einfach nur*p
schreiben, da C jeden Wert ungleich 0 als wahr auffasst.
Hier spielt es auch keine Rolle ob du das Post- oder Preinkcrement benutzt.Also wenn du sowas wie
for (p = wort; *p; ++p)
siehst, ist es das Gleiche wie dein Code.