Forum: Compiler & IDEs Stringaufgabe


von Gerd U. (Gast)


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.

von Hc Z. (mizch)


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.

von Gerd U. (Gast)


Lesenswert?

>  Vokale im
> Gesamttext kannst Du so nicht suchen.

Ja warum nicht wenn es auf alle.  Zahlen, Buchtstaben, Sonderzeichen. 
zutrifft.

von Hc Z. (mizch)


Lesenswert?

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.

von Gerd U. (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Weil da die Funktion strcspn benutzt wird, du aber die Funktion strspn 
nimmst?

    strcspn
    strspn

Was so ein kleines c alles ausmachen kann :-)

von Hc Z. (mizch)


Lesenswert?

Witzbold.  Weil Du strcspn() genommen hast und nicht strspn().

von Gerd U. (Gast)


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

von Gerd U. (Gast)


Lesenswert?

Funktioniert bei beiden nicht.
Auch wenn ich mich verschrieben habe ;)

von Hc Z. (mizch)


Lesenswert?

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.

von Gerd U. (Gast)


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.

von Rolf M. (rmagnus)


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.

von Hc Z. (mizch)


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.

von Karl H. (kbuchegg)


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.

von Gerd U. (Gast)


Lesenswert?

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