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
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.
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);
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.. ;-)
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.
DjKle schrieb:> Hallo Stefan,> habe nur kleine Änderungen gemacht und ein Kleinigkeit dazu.> Gruß: DjKle
na hoffentlich gibt keiner mehr als 33 zeichen ein.
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: