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.
> Vokale im > Gesamttext kannst Du so nicht suchen. Ja warum nicht wenn es auf alle. Zahlen, Buchtstaben, Sonderzeichen. zutrifft.
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??
Weil da die Funktion strcspn benutzt wird, du aber die Funktion strspn nimmst? strcspn strspn Was so ein kleines c alles ausmachen kann :-)
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.
Ja das mit den Konstanten hab ich in kauf genommen... mir war es wichtig mit den vokalen habs jetzt aber umgeschrieben es funzt. Danke
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.