mikrocontroller.net

Forum: Compiler & IDEs Stringaufgabe


Autor: Gerd U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerd U. schrieb:
> Kennt sich hier jemand mit dem Stringbefehl "strspn" aus ?

Am besten die man-page:
      size_t strspn(const char *s, const char *accept);

      The  strspn() function calculates the length of the initial segment of s which con-
       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.

Autor: Gerd U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  Vokale im
> Gesamttext kannst Du so nicht suchen.

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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gerd U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil da die Funktion strcspn benutzt wird, du aber die Funktion strspn 
nimmst?

    strcspn
    strspn

Was so ein kleines c alles ausmachen kann :-)

Autor: Hc Zimmerer (mizch)
Datum:

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

Autor: Gerd U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Gerd U. (Gast)
Datum:

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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gerd U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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:
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
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.

Autor: Gerd U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.