Kennt sich hier jemand mit dem Stringbefehl "strspn" aus ?
Ist dieser Befehl nur bei Zahlen oder auch bei Buchstaben anwendbar?
Da,
bei folgendem Code:
char string[]="Alle Vokale werden gezaehlt";
char string_ohne[] = "aeiou";
int anzahl = strspn(string, string_ohne);
int konst = strlen(string)-anzahl;
printf("Anzahl Vokale: %d Anzahl der Konstanten: %d", anzahl,konst);
Anzahl Vokale: 0 angegeben ist.
Gerd U. schrieb:> Kennt sich hier jemand mit dem Stringbefehl "strspn" aus ?
Am besten die man-page:
1
size_t strspn(const char *s, const char *accept);
2
3
The strspn() function calculates the length of the initial segment of s which con-
4
sists entirely of characters in accept.
>> Ist dieser Befehl nur bei Zahlen oder auch bei Buchstaben anwendbar?
Strings. Alle. Zahlen, Buchtstaben, Sonderzeichen. Egal.
> Da,> bei folgendem Code:>> char string[]="Alle Vokale werden gezaehlt";> char string_ohne[] = "aeiou";>> int anzahl = strspn(string, string_ohne);> int konst = strlen(string)-anzahl;> printf("Anzahl Vokale: %d Anzahl der Konstanten: %d", anzahl,konst);>>> Anzahl Vokale: 0 angegeben ist.
Ja. Wenn man ab Beginn ein Segment sucht, das ausschließlich aus
"aeiou" besteht, ist dessen Länge 0. Es gibt keines. Der String
beginnt mit „A“, und das passt schon nicht. Eine weitere Suche erübrigt
sich, da ein am Beginn verankertes Segment gesucht wird. Vokale im
Gesamttext kannst Du so nicht suchen.
Weil strspn() ein Segment sucht, das beim ersten Buchstaben beginnt.
Beim ersten Buchstaben, der nicht passt, wird aufgehört. Das ist in
Deinem Beispiel der erste. Lies Dir einfach die Beschreibung von
strspn() durch.
Ja das ist klar aber warum funktioniert es im folgenden Beispiel
char string[] = "Kurt ist 33 Jahre";
char spanset[] = "1234567890";
int len = strcspn(string, spanset);
printf("Das Alter von Kurt steht an Position %d\n", len);
Da ist doch auch das erste Zeichen nicht das gesuchte??
Selbst wenn ich folgenden Code mit strcspn implementiere funktioniert es
nicht.
#include <stdio.h>
#include <string.h>
int main ()
{
char string[]="Alle Vokale werden gezaehlt";
char string_ohne[] = "AEIOUaeiou";
int anzahl = strcspn(string, string_ohne);
int konst = strlen(string)-anzahl;
printf("Anzahl Vokale: %d Anzahl der Konstanten: %d", anzahl,konst);
return 0;
}
Ist es so schwierig, zu verstehen, dass strspn() und strcspn() die Länge
des Strings ab Beginn ermitteln, der die Bedingung erfüllt? Und nicht
den gesamten String nach Teilen untersucht, die zur Bedingung passen?
Das steht doch im C-Buch.
:
> Ist es so schwierig, zu verstehen, dass strspn() und strcspn() die Länge> des Strings ab Beginn ermitteln, der die Bedingung erfüllt?
Ja dann würde es ja bei obigen Beispiel auch nicht funktionieren, da
0123456789 ungleich K ist.
Gerd U. schrieb:> :>> Ist es so schwierig, zu verstehen, dass strspn() und strcspn() die Länge>> des Strings ab Beginn ermitteln, der die Bedingung erfüllt?>> Ja dann würde es ja bei obigen Beispiel auch nicht funktionieren, da> 0123456789 ungleich K ist.
Das ist der Unterschied zwischen strspn() und strcspn(). Die Bedingung
ist umgekehrt. Bei ersterem muß das Stringelement Teil der angegebenen
Zeichenliste sein, bei letzterem darf es das nicht. Das heißt, daß dir
in dem Beispiel strcspn() sagt, wieviele nicht-Ziffern am Anfang von
"Kurt ist 33 Jahre" stehen.
Eben deshalb funktioniert es. Denn Du hast strcspn() verwendet. Somit
erfüllt „ungleich“ die Bedingung.
Möchtest Du beweisen, dass C nicht funktioniert? Dass Dir Unrecht getan
wird? Oder möchtest Du herausfinden, wie es richtig geht? Nach
Letzterem klingt das alles nicht. Wie dem auch sei, ich bin raus.
Gerd U. schrieb:> :>> Ist es so schwierig, zu verstehen, dass strspn() und strcspn() die Länge>> des Strings ab Beginn ermitteln, der die Bedingung erfüllt?>> Ja dann würde es ja bei obigen Beispiel auch nicht funktionieren,
Das 'funktionierende' Beispiel macht aber etwas ganz anderes.
Es gibt einen Unterschied zwischen:
Ermittle wieviele 'Elemente' in einem String eine Bedingung erfüllen
und
Ermittle wo ein Teilstring anfängt, der bestimmte Bedingungen erfüllt.
Dein 'funktionierendes' Beispiel macht zweiteres.
Du willst aber ersteres.
Wenn in deinem Testprogramm die Ausgabe gelautet hätte:
1
In "Alle Vokale werden gezaehlt" steht der erste Vokal an Position 0.
dann wäre das absolut korrekt und du hättest strcspn dafür benutzen
können.
Wenn deine Ausgabe gelautet hätte
1
Der Satz "Alle Vokale werden gezaehlt" beginnt mit 1 Vokal
dann ist das ebenfalls abolut korrekt und du hättest strspn dafür
benutzt.
Nur: Aus der Tatsache, dass dieser Satz mit 1 Vokal anfängt, kannst du
nicht schliessen, wieviele Vokale noch im String vorkommen.
Du benutzt ganz einfach das falsche Werkzeug für den falschen Job.
Da wird dir wohl nichts anderes übrig bleiben, als die Funktion die du
haben willst selbst zu schreiben. So schwer ist das nicht.
Und ja: man kann eine Kombination aus beiden Funktionen dafür benutzen.
Ob man das machen will und ob das im konkreten Fall so schlau ist, ist
eine andere Frage. Denn: Hmm. Was ist eigentlich mit Leerzeichen oder
Sonderzeichen?
"Alle Vokale werden gezaehlt"
Wenn ich mich nicht verzählt habe, dann sind da 10 Vokale drinnen. Der
String hat eine Länge von 27 Zeichen. Laut deiner Rechnung macht das 27
- 10 gleich 17 Konsonanten. Wenn ich aber händisch nachzähle, komme ich
nur auf 14.