Hallo, ich will ein Programm schreiben zur ermittlung der Buchstaben eines Strings. Allerdings liefert das Programm falsche Ergebnise. Es wird zwar ne Zahl angezeigt aber nicht die Anzahl der eingegebenen Buchstaben. #include <stdio.h> #include <stdlib.h> // Prototyp int anzahlderBuchstab(char z[]); int main(void){ char zk[]; printf("Gib Zeichenkette ein: \n"); scanf("%s", zk); printf("Anzahl Buchstaben der Zeichenkette %s: %d\n", zk, anzahlderBuchstab(zk)); return 0; } // vollständige Funktion int anzahlderBuchstab(char z[]){ int buchstaben=0; char *ptr_z; ptr_z = &z; while(*ptr_z != '\n'){ if(*ptr_z >= 'A' && *ptr_z <= 'Z' || *ptr_z >= 'a' && *ptr_z <= 'z'){ buchstaben++; } ptr_z++; } return buchstaben; } Weiß jemand waran das liegen könnte? Besten Dank, schonmal Stefan
Bist du denn sicher das der string mit einem '\n' endet?
Peter II schrieb: > Bist du denn sicher das der string mit einem '\n' endet? Ne :), daran lags. Habe jetzt noch das letzte Element mit '\n' belegt. Und Danke für deine Hilfe.
ja, C ist lustig ... char zk[]; ... scanf("%s", zk); ... ich (hab gottseidank keine Ahnung von C) aber IMHO muss man den Speicher reservieren, wohin der eingelesene string soll...
Stefan schrieb: > Ne :), daran lags. Habe jetzt noch das letzte Element mit '\n' belegt. > Und Danke für deine Hilfe. und warum nicht wiè in C üblich auf 0 abfragen?
Peter II schrieb: > Stefan schrieb: >> Ne :), daran lags. Habe jetzt noch das letzte Element mit '\n' belegt. >> Und Danke für deine Hilfe. > > und warum nicht wiè in C üblich auf 0 abfragen? Gute Frage eigentlich wollte ich das der string gescannt wird bis zum letzten Element und als letzes element ist doch immer 0 oder? Dann ist es wirklich einfacher.
Peter II schrieb: > und warum nicht wiè in C üblich auf 0 abfragen? Würde ich auch sagen. Scanf garantiert dass der eingelesene String mit einem Nullbyte terminiert wird. http://linux.die.net/man/3/scanf L.g.
gabs da nicht schon Standard-Methoden wie .sizeof() oder .find()...
Stefan schrieb: > Ne :), daran lags. Habe jetzt noch das letzte Element mit '\n' belegt. > Und Danke für deine Hilfe. Du solltest Dein Programmversuch noch einmal gründlich überarbeiten. Robert L. schrieb: > ja, C ist lustig Nicht C sondern der TO
wenn ich dich wäre, würde ich den Funktionsaufruf vor der Printf-Ausgabe machen. deklariere eine weitere Variabe wie int anzahl = 0; Syntax für Funktionsaufruf: anzahl = anzahlderBuchstab(zk); printf("Anzahl Buchstaben der Zeichenkette %s: %d\n", zk,anzahl);
Steve F. schrieb: > gabs da nicht schon Standard-Methoden wie .sizeof() oder .find()... nö, weil c gar keine Methoden kennt.
Peter II schrieb: > Steve F. schrieb: >> gabs da nicht schon Standard-Methoden wie .sizeof() oder .find()... > > nö, weil c gar keine Methoden kennt. Aber in der "string.h" gäbe es eine Funktion strlen(). http://linux.die.net/man/3/strlen
Urban B. schrieb: > Aber in der "string.h" gäbe es eine Funktion strlen(). und diese macht nichts anders als im string nach der ersten 0 zu suchen. Damit ist es programm dann doppelt so langsam, weil der string 2 mal komplett durchsucht wird.
Peter II schrieb: > und diese macht nichts anders als im string nach der ersten 0 zu suchen. Ja klar, und genau das möchte doch der TO, oder nicht? ;-) Wollte das nur erwähnen, vielleicht hat der TO die Funktion nur darum selber geschrieben, weil er nicht wusste, dass es das schon gibt. Ob er die nun nutzen will oder nicht, das ist natürlich ihm überlassen. > Damit ist es programm dann doppelt so langsam, weil der string 2 mal > komplett durchsucht wird. Da der TO vermutlich sein Programm auf einem PC laufen lassen möchte (nicht auf einem uC) wird kaum jemand interessieren wie schnell diese Funktion ist. mfg
>Ja klar, und genau das möchte doch der TO, oder nicht? ;-)
nein
er sucht "Buchstaben" (a-z und A-Z)
solange bis der String aus ist...
vorher die länge des string zu ermitteln ist unnütz ...
ps. meine frage, ob man nicht für char zk[]; speicher reservieren
sollte, wurde noch nicht beantwortet.. ;-)
Ach so, jetzt habe ich es auch grad kapiert...Anzahl der Buchstaben, nicht Anzahl der Zeichen...Wer lesen kann ist im Vorteil ;-) Sorry.
Der TO möchte nicht die Länge des Strings wissen, sondern die Anzahl der Buchstaben ...
Robert L. schrieb: > ps. meine frage, ob man nicht für char zk[]; speicher reservieren > sollte, wurde noch nicht beantwortet.. ;-) oh, wurde übersehen. JA das solltest du machen!
Robert L. schrieb: >> > ps. meine frage, ob man nicht für char zk[]; speicher reservieren > sollte, wurde noch nicht beantwortet.. ;-) Ja sollte, sonst gibt mein Netbeans aus: array size missing in 'zk' Hatte ich unterschlagen.
Speicher muss vorher vorhanden sein und für den Test auf Buchstaben, gibt es das isalpha() aus ctype.h
Hallo Stefan, habe nur kleine Änderungen gemacht und ein Kleinigkeit dazu. Gruß: DjKle
DjKle schrieb: > Hallo Stefan, > habe nur kleine Änderungen gemacht und ein Kleinigkeit dazu. > Gruß: DjKle na hoffentlich gibt keiner mehr als 33 zeichen ein.
1 | char *ptr_z; |
2 | ptr_z = &z[0]; |
3 | while(*ptr_z != '\0'){ |
ist zwar richtig, aber irgendwie umständlich.
1 | char *ptr_z = z; |
2 | while( *ptr_z ){ |
Peter II schrieb: > ist zwar richtig, aber irgendwie umständlich. > >
1 | > char *ptr_z = z; |
2 | > while( *ptr_z ){ |
3 | >
|
und wofür der ptr_z notwendig ist, ist auch nicht wirklich klar. z ist eine lokale Variable und auch wenn sie in der Argumentliste als [] geschrieben ist, ist es doch ein Pointer. Überhaupt: die [] Schreibweise ist nicht sehr glücklich. Sie suggeriert etwas, das nicht vorhanden ist. Der *ptr_z++ da unten in der Funktion. Von dem ist auch nicht klar, wozu der gut sein soll. Das wär meine Version:
1 | #include <ctype.h> |
2 | |
3 | int anzahlderBuchstab(const char* str) |
4 | {
|
5 | int buchstaben = 0; |
6 | |
7 | while( *str ) { |
8 | if( isalpha(*str++) ) |
9 | buchstaben++; |
10 | }
|
11 | |
12 | return buchstaben; |
13 | }
|
Man könnte das int noch durch size_t ersetzen (wie bei strlen). ;-)
Jep. Zumal es eher ungewöhnlich ist, dass in einem String -5 Buchstaben enthalten sind :-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.