Forum: PC-Programmierung Anzahl buchtaben eines Strings bestimmen


von Stefan (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

Bist du denn sicher das der string mit einem '\n' endet?

von Stefan (Gast)


Lesenswert?

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.

von Robert L. (lrlr)


Lesenswert?

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...

von Peter II (Gast)


Lesenswert?

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?

von Stefan (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

einfach
1
while( *ptr_z ){

und gut ist.

von Michael R. (dj_motionx)


Lesenswert?

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.

von Stefan F. (kpy3ep) Benutzerseite


Lesenswert?

gabs da nicht schon Standard-Methoden wie .sizeof() oder .find()...

von Mikel M. (mikelm)


Lesenswert?

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

von Elias (Gast)


Lesenswert?

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);

von Peter II (Gast)


Lesenswert?

Steve F. schrieb:
> gabs da nicht schon Standard-Methoden wie .sizeof() oder .find()...

nö, weil c gar keine Methoden kennt.

von Gelöscht (kami89)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von Gelöscht (kami89)


Lesenswert?

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

von Robert L. (lrlr)


Lesenswert?

>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.. ;-)

von Gelöscht (kami89)


Lesenswert?

Ach so, jetzt habe ich es auch grad kapiert...Anzahl der Buchstaben, 
nicht Anzahl der Zeichen...Wer lesen kann ist im Vorteil ;-) Sorry.

von Buchstabenzähler (Gast)


Lesenswert?

Der TO möchte nicht die Länge des Strings wissen, sondern die Anzahl der 
Buchstaben ...

von Peter II (Gast)


Lesenswert?

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!

von Stefan (Gast)


Lesenswert?

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.

von DirkB (Gast)


Lesenswert?

Speicher muss vorher vorhanden sein und für den Test auf Buchstaben, 
gibt es das isalpha() aus ctype.h

von DjKle (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Stefan,
habe nur kleine Änderungen gemacht und  ein Kleinigkeit dazu.
Gruß: DjKle

von Peter II (Gast)


Lesenswert?

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 ){

von Karl H. (kbuchegg)


Lesenswert?

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
}

von Auch egal (Gast)


Lesenswert?

Man könnte das int noch durch size_t ersetzen (wie bei strlen). ;-)

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.