Stringaufgabe

Gast #2025565
Lesenswert?

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.
#2025576
Lesenswert?

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.
Gast #2025607
Lesenswert?

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??
Gast #2025624
Lesenswert?

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;
}
Gast #2025633
Lesenswert?

:
> 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.
#2025643
Lesenswert?

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.
#2025647
Lesenswert?

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.
#2025685
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren