tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
390
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    lindin lindin ist offline Mitglied Brokat
    Registriert seit
    Jun 2004
    Beiträge
    278
    Hallo,

    es gibt eine Oraclefunktion, die folgendermaßen funktioniert:


    Code :
    1
    2
    
    translate ('1tech23', '123', '456); would return '4tech56' 
    translate ('222tech, '2ec', '3it'); would return '333tith'

    Es werden also alle Zeichen aus dem ersten String, die im zweiten String vorkommen, mit dem Zeichen ersetzt, welches im dritten String an der gleichen Stelle ist, wie das im zweiten String!

    Kompliziert ausgedrückt, aber das Beispiel zeigt es ganz gut!

    ich könnte natürlich für jedes Zeichen in String 1, String 2 durchsuchen, und dann den Index nehmen, und das Zeichen aus String drei nehmen, aber vielleicht gibt es ja auch so eine Funktion in c?

    Mir würde ja eine Funktion wie die java-Funktion getIndexOf() (oder so ähnlich) schon weiterhelfen!

    Weiß da jemand was?
     

  2. #2
    lindin lindin ist offline Mitglied Brokat
    Registriert seit
    Jun 2004
    Beiträge
    278
    Also das ist ja doch nicht soviel, nur ne for() {for(){if(){}}}-Verschachtelung!
     

  3. #3
    Beichtpfarrer Beichtpfarrer ist offline Mitglied Brokat
    Registriert seit
    Jan 2004
    Ort
    Wannweil
    Beiträge
    302
    strchr -> findet einen char in einem String und liefert einen Zeiger darauf zurück, false, falls er nicht gefunden wurde. (Daraus kannst du dir natürlich auch einen Index errechnen, ist ja aber nicht nötig.)

    Die Funktion könnte dann zB so aussehen:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    void translate(char*str, const char*tr, const char*by){
        int index = 0;
        while(tr[index]){
            char* tmp = str;
            while(tmp){
                tmp = strchr(tmp, tr[index]);
                *tmp = by[index];
            }
        }
    }


    Dann gibts noch irgendeine Funktion, die gibt dir direkt den Index des übergebenen chars in einem String zurück. Wie die heisst, hab ich aber vergessen, ausserdem hat sie keine Error-Return, falls der char nicht gefunden wurde (hab noch nie ausprobiert, was dann zurückgegeben wurde).
     
    Noch weiter helfen jetzt nur noch google, msdn, Tutorials, Forumssuche, Eingebungen, Glück und ein wenig Hirnanstrengung.

  4. #4
    lindin lindin ist offline Mitglied Brokat
    Registriert seit
    Jun 2004
    Beiträge
    278
    Meinst Du, meine Funktion geht auch? Die sieht soviel einfacher aus, daß ich denke, sie tut doch nicht das richtige....:

    Code :
    1
    2
    3
    4
    5
    6
    7
    
    for(i=0;i<strlen(stringtotransform);i++){
           for(x=0;x<96;x++){
               if(stringtotransform[i]==from[x]){
                   stringtotransform[i]=to[x];
               }
           }
       }

    In strintotransform sthet ser zu transfromierende String, in from stehen die ZEichen die umgewandelt werden sollen, und in to, die, in die sie umgewandelt werden sollen!
     

  5. #5
    Beichtpfarrer Beichtpfarrer ist offline Mitglied Brokat
    Registriert seit
    Jan 2004
    Ort
    Wannweil
    Beiträge
    302
    Code :
    1
    
    for(i=0;i<strlen(stringtotransform);i++){
    d.h: Bei jedem Schleifendurchlauf muss die Stringlänge neu bestimmt werden.
    Das ist geschwindigkeitsmässig nicht sonderlich überzeugend, besser wäre:
    Code :
    1
    2
    
    int i = strlen(stringtotransform);
    while(i--){
    ( ausserdem arbeite ich einfach lieber mit while-schleifen , da for-schleifen meistens nur 1-2 zeilen weniger Platz zu Ungunsten der Codelesbarkeit einnehmen.)

    ...
    Code :
    1
    
    for(x=0;x<96;x++){
    Ist die Länge von from und to denn immer genau 96?
    Besser wäre:
    Code :
    1
    2
    
    int x = -1;
    while(from[++x]){

    Und nochmal zusammengefasst:
    Code :
    1
    2
    3
    4
    5
    6
    7
    
    int i = strlen(stringtotransform);
    while(i--){
        int x = -1;
        while(from[++x])
           if(stringtotransform[i]==from[x])
               stringtotransform[i]=to[x];
    }

    Aber ansonsten sollte es funktionieren, würd ich auf den ersten Blick sagen. Die Geschwindigkeit wäre vielleicht (aber nur vielleicht, denn man kann ja nie wissen, wie schnell Routinen wie strchr arbeiten) sogar schneller, als mein Vorschlag.
     
    Noch weiter helfen jetzt nur noch google, msdn, Tutorials, Forumssuche, Eingebungen, Glück und ein wenig Hirnanstrengung.

  6. #6
    lindin lindin ist offline Mitglied Brokat
    Registriert seit
    Jun 2004
    Beiträge
    278
    Hm, ja, im "Optimieren" bin ich nicht besonders gut

    Danke für Deine Hilfe
     

  7. #7
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Ich würde die Regex-Library von Boost für sowas empfehlen.
    Regex=Regular Expressions, Boost=www.boost.org
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 20.06.10, 00:56
  2. Antworten: 2
    Letzter Beitrag: 05.04.10, 23:31
  3. Antworten: 5
    Letzter Beitrag: 04.03.06, 19:07
  4. Antworten: 1
    Letzter Beitrag: 31.12.04, 14:20
  5. "Inhalt" von char in if Schleife einbauen
    Von mR.MiFiStO im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 06.04.02, 20:20