Zeichen eines String zählen



  • hallo,

    Ich habe einen String(keinen C-String!), der aus Dezimalzahlen besteht,durch Semikolon getrennt z.B.
    555;666;777;888 usw.
    jetz benötige ich folgende funktionen:

    1. wie kann ich zählen, wieviele zeichen der String lang ist
    2. wie kann ich zählen, wieviele ; in dem String enthalten sind

    danke schonmal



  • 1. lngth=str.length();
    2. cnt=count(str.begin(),str.end(),';');



  • Danke für die schnelle antwort!!!!!!!!!!!!

    zwei Fragen noch:
    gibt es eine Funktion, mit der ich ein einzelnes Zeichen des String auslesen kann?
    gibt es eine Funktion, die den String zerlegt, indem sie ihn an den ; trennt und die werte dazwischen in ein Feld aus Int-Zahlen schreibt?



  • bikstfri schrieb:

    gibt es eine Funktion, mit der ich ein einzelnes Zeichen des String auslesen kann?

    str[5];

    bikstfri schrieb:

    gibt es eine Funktion, die den String zerlegt, indem sie ihn an den ; trennt und die werte dazwischen in ein Feld aus Int-Zahlen schreibt?

    Man kann den string in einen stringstream stopfen und dann den stringstream auslesen, als wäre er eine Datei.



  • edit: Entschuldigung, hab es übersehen.



  • zuckerlie schrieb:

    Schau mal hier, die cstring bzw. string.h
    http://www.proggen.org/doku.php?id=c:lib:string:start
    http://www.cplusplus.com/reference/clibrary/cstring/

    Womit wir genau bei dem Header wären, den er NICHT braucht. Er benutzt C++ std::string, keine C-Strings.



  • Ich habe mir jetz selbst eine funktion zum zerlegen gebastelt, nur irgendwie lieert sie die falschen ergebnisse.

    Ziel ist es, den String (wird aus einer Datei eingelesen, das hab ich hier mal weggelassen) in das Feld von Int-Zahlen zu übertragen

    hier mal der code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string>
    using namespace std;
    
    int main()
    {   String s="440;550;660;770;880;990";
        int cnt=count(s.begin(),s.end(),';'); 
        int frequenzen[cnt+1];
        int i=0;
        for (i=0;i<=cnt+1;i++) frequenzen[i]=0;
    
        int lngth=s.length(); 
        int j=0;  
        for (i=0;i<=lngth;i++)        
            if (s[i]==';') j++;
            else frequenzen[j]=frequenzen[j]*10+atoi(&s[i]); 
    
        for (i=0;i<=cnt+1;i++)  printf("%d\n",frequenzen[i]);
    
        printf("Zum Beenden eine Taste druecken!...\n");
         _getch();   
         }
    

    nur leider kommt dabei nicht das raus, was ich mir erhofft habe, sondern:
    44400
    55500
    66600
    77700
    88800
    99900
    0
    Zum Beenden eine Taste druecken!...

    findet jemand von euch den Fehler?

    danke



  • atoi() nimmt die ganze Zeichenkette ab der Adresse. Nicht das einzelne Zeichen.

    Dein Programm rechnet: (Das gefundene Zeichen ist fett

    0 * 10 + [b]4[/b]40
     440 * 10 + [b]4[/b]0
    4440 * 10 + [b]0[/b]
    


  • Danke, das erklärt mir schonmal die ergebnisse. was muss ich jetz an meinem Code ändern, damit er funktioniert?



  • Sorry, die Namen cnt und lngth waren ein Scherz. Die solltest Du natürlich nicht nehmen.
    "f y cn rd ths, y wll b gd cmptr prgrmmr!"



  • Wenn du es selber rechnen willst:

    else frequenzen[j]=frequenzen[j]*10+(s[i]-'0');
    

    ⚠ Bei

    int frequenzen[cnt+1]; // cnt+1 Elemente von 0 ... cnt 
        int i=0;
        for (i=0;i<=cnt+1;i++) frequenzen[i]=0;
    

    läuft dein Index zu weit. Der Maximale Index darf cnt sein.



  • Hi volkard,
    ja die namen sind ja nicht das entscheidende. daran liegt es auch sicher nicht das es ncht so funktioniert wie ich will. und es is ja erstmal nur ein versuch für mich, es muss also niemand anderes lesen können.



  • DirkB schrieb:

    Wenn du es selber rechnen willst:

    else frequenzen[j]=frequenzen[j]*10+(s[i]-'0');
    

    ⚠ Bei

    int frequenzen[cnt+1]; // cnt+1 Elemente von 0 ... cnt 
        int i=0;
        for (i=0;i<=cnt+1;i++) frequenzen[i]=0;
    

    läuft dein Index zu weit. Der Maximale Index darf cnt sein.

    Danke, das mit dem Index hab ich mittlerweile auch schon bemerkt, daher kommt auch die einzelne 0 bei meiner ausgabe



  • DirkB schrieb:

    Wenn du es selber rechnen willst:

    else frequenzen[j]=frequenzen[j]*10+(s[i]-'0');
    

    wenn ich die Zeile mit dem else durch deinen Vorschlag ersetze, erscheint bei mir folgender Fehler:
    no match for 'operator-' in 's[i] - '0'

    ich verwende DEV-C++



  • Bah, das geht ja Schlag auf Schlag hier.

    Ich habe trotzdem noch zwei Anmerkungen: Erstens ist

    int frequenzen[cnt+1];
    

    kein gültiges C++, und es gibt gängige Compiler, die so etwas schlicht nicht übersetzen (MSVC beispielsweise). Du solltest es durch

    #include <vector>
    
    ...
    
    std::vector<int> frequenzen(cnt + i);
    

    ersetzen.

    Außerdem erzeugt atoi(&s[i]), wenn man es streng nimmt (und das sollte man als Programmierer), undefinertes Verhalten, weil der Standard nicht garantiert, dass std::string seine Daten an einem Stück speichert, und auch nicht, dass sie null-terminiert sind, wie atoi es erwartet. Das ist mit der genannten Lösung zwar hinfällig, aber behalt es im Hinterkopf, wenn du mal wieder so etwas machen willst. Man könnte stattdessen

    atoi(s.c_str() + i)
    

    schreiben; c_str() gibt einen C-String zurück, bei dem man sich auf diese Mechanik verlassen kann.



  • Wie wärs wenn du anfangen würdest C++ zu coden? Dein Code tut in den Augen weh und ist mehr C als C++.
    Statt atoi nutzt man etwas anderes in C++: http://www.c-plusplus.net/forum/39488
    Und die Anmerkungen von seldon würde ich mir sehr zu Herzen nehmen.
    Außerdem, lad dir eine vernünftige IDE runter, Dev-C++ ist wohl die mieseste.



  • Dev-C++ ist vor allem hoffnungslos veraltet. Es gibt ein Projekt, das den Kram weiterentwickelt; ich kann aber nicht sagen, wie brauchbar das ist. Außerdem seien genannt: Codelite, Code::Blocks, und Visual Studio Express. Alle frei verfügbar und aktiv weiterentwickelt.



  • FreakY<3Cpp schrieb:

    Wie wärs wenn du anfangen würdest C++ zu coden? Dein Code tut in den Augen weh und ist mehr C als C++.
    Statt atoi nutzt man etwas anderes in C++: http://www.c-plusplus.net/forum/39488
    Und die Anmerkungen von seldon würde ich mir sehr zu Herzen nehmen.
    Außerdem, lad dir eine vernünftige IDE runter, Dev-C++ ist wohl die mieseste.

    Wenn du ein Problem damit hast, musst du meinen Code ja nicht lesen sondern hälst einfach mal deine Klappe, einen Beitrag der nicht hilfreich ist, kannst du dir auch sparen.
    Das Dev-C++ funktioniert für das was ich mache super. Hatte vorher Visual Studio, aber da haben dann einige andere Microsoft-Programme nicht mehr das gemacht, was sie sollten. Media-Center hat sich mit Fehlermeldungen überschlagen und ging dann garnicht mehr.



  • bikstfri schrieb:

    Wenn du ein Problem damit hast, musst du meinen Code ja nicht lesen sondern hälst einfach mal deine Klappe, einen Beitrag der nicht hilfreich ist, kannst du dir auch sparen.

    Mein Beitrag enthielt eine Verlinkung zur besseren Variante von atoi, machte dich drauf aufmerksam das du mehr C als C++ codest und ich gab dir den Rat, eine neue IDE aufzusuchen.

    bikstfri schrieb:

    Das Dev-C++ funktioniert für das was ich mache super. Hatte vorher Visual Studio, aber da haben dann einige andere Microsoft-Programme nicht mehr das gemacht, was sie sollten. Media-Center hat sich mit Fehlermeldungen überschlagen und ging dann garnicht mehr.

    Volle Punktzahl für das beste Argument weiterhin Dev-C++ zu nutzen. Es hat sich mit Fehlermeldungen überschlagen und das gibt dir nicht zu denken übrig? Hauptsache du hast eine IDE und einen Kompilierer der jeden Mist schluckt und sich dann wundern wenn man mit Code aus C in ein C++ Sub-Forum kommt, nichts funktioniert und trotzdem zu seiner schönen IDE steht, welchen Code kompiliert, bei dem meine Errors und Warnings spuckt.
    Und selbst wenn Visual Studio nicht funktioniert hat, gibt es immer noch genügend andere und bessere IDEs, z.B. die, die seldon erwähnt hat. Wenn du hier schon gesagt bekommst, dass Dev-C++ schlecht ist, bringt dein Argument "es läuft" auch nicht viel. Mit einem Auto aus dem Jahre 1950 komm ich "wahrscheinlich" auch an mein Ziel, aber ich habe wesentlich mehr Komplikationen als mit einem neu modernen Auto das ein Navigationssystem enthält. Alleine das String kann schon nicht richtig sein und selbst bei Dev-C++ wundert es mich, dass es das kompiliert.
    Wenn du hilfreiche Kritik nicht verträgst, frag doch dein Hilfecenter von Dev-C++.



  • FreakY<3Cpp schrieb:

    Volle Punktzahl für das beste Argument weiterhin Dev-C++ zu nutzen. Es hat sich mit Fehlermeldungen überschlagen und das gibt dir nicht zu denken übrig? Hauptsache du hast eine IDE und einen Kompilierer der jeden Mist schluckt und sich dann wundern wenn man mit Code aus C in ein C++ Sub-Forum kommt, nichts funktioniert und trotzdem zu seiner schönen IDE steht, welchen Code kompiliert, bei dem meine Errors und Warnings spuckt.

    Da solltest du lieber mal lesen lernen, bevor du antwortest
    nicht das Visual Studio hat sich mit fehlermeldungen überschlagen.
    die anderen Programme haben fehlermeldungen geliefert und nicht das Visual studio.
    Aber wenn du nicht lesen kannst, dann sei einfach ruhig.


Anmelden zum Antworten