String Replace, als ziel eine Wildcard?



  • Doch compiliert und funzt sogar...

    Ich hab einen serial mit zufaelligen Zahlen und 5 zufaellige Buchstaben.
    Ich möchte dann 5 zufaellig positionierte Zahlen mit fuenf Buchstaben ersetzen.

    So dachte ich es mir zumindest...

    for (int l=0; l<1000; l++)                           // 4 Random Buchstaben aus der Liste Waehlen
          {
          X = (rand() % 2420);
          if ( Z<5 && X < 26)
            {
            zeichen[Z] = buchstabe[X];
            Z++;
            }
          }
    
    int wert1[15];                                      // 16 Zufaellige Zahlen generieren und in Array Schreiben
      int i=0;
    
        randomize();
        for(i=0; i<16; i++)
          {
          wert1[i] = (rand() % 10);
          }
    
    int zen;
    AnsiString text;
    char* lust;
    for (int i=0;i<6; i++)
      {
      zen = (rand() % 15);
      text  = StringReplace(wert1[zen], wert1[zen], zeichen[i], TReplaceFlags() << rfReplaceAll);
    
      char* lust = text.c_str();
      Memo1->Lines->Add (text);
      wert1[zen] = lust;
      }
    


  • Also eigentlich geht es nur darum:

    int zen;
    AnsiString text;
    char* lust;
    for (int i=0;i<6; i++)
      {
      zen = (rand() % 15);
      text  = StringReplace(wert1[zen], wert1[zen], zeichen[i], TReplaceFlags() << rfReplaceAll);
      Memo1->Lines->Add (text);
      wert1[zen] = text;      [e]rarr[/e] // hier kommt die fehlermeldung dass AnsiString nicht nach int konvertiert werden kann
      }
    


  • So richtig verstehe ich zwar immer noch nicht was du willst aber es sind schon Fehler in deinem Code.
    int wert1[15]; Damit erzeugst du ein Array auf int mit 15 Elementen (nicht 16), du hast also 1 zu wenig.

    StringReplace(wert1[zen], wert1[zen], zeichen[i], TReplaceFlags() << rfReplaceAll);
    

    Was das machen soll begreife ich gar nicht. Hier mal der Hilfeeintrag zu StringReplace.

    extern PACKAGE AnsiString __fastcall StringReplace(const AnsiString S, const AnsiString OldPattern, const AnsiString NewPattern, TReplaceFlags Flags);

    Irgendwie passt das nicht zusammen.



  • Also eigentlich versuch ich nix anderes als einen serial mit zufaelliger Zahlen und Buchstaben kombination zu erzeugen... 🙂



  • Also eigentlich versuch ich nix anderes als einen serial mit zufaelliger Zahlen und Buchstaben kombination zu erzeugen... 🙂



  • Braunstein schrieb:

    Irgendwie passt das nicht zusammen.

    Ich glaube AnsiString hat einen Konstruktor der int annimmt, daher wird also einfach über den Kontruktor konvertiert.



  • Stimmt, den hatte ich ganz vergessen. 😞
    @s0h0
    Warum füllst du nicht einfach einen string mit allen möglichen Buchstaben und Ziffern (siehe ASCII-Tabelle) und wählst dann daraus zufällig aus. Das sollte doch einfacher sein. Du musst doch hier nichts ersetzen.



  • Ja, hört sich gut an! 🙂

    Habs nur leider nicht anders hingekriegt...
    Mein Bruder hats mir in Delphi mit der Ansi Tabelle gezeigt, da waren es 10 code zeilen und es ging.

    Aber ich bekomms net hin.

    Aber den String fuellen und dann zufaellig auswaehlen is auch gut...

    Doch ich glaub des hauptproblem warum ich diesen weg gegangen bin, war,
    dass ich zufaellige Zahlen erstellen kann mit rand()... Aber ich net weiss wie ich zufaellige Buchstaben herkrieg!

    Ach ja:

    Danke fuer die Hilfe bis jetzt, bin echt ueberrascht wie schnell und gut einem geholfen wird in einem Forum!



  • Du musst doch keine zufälligen Buchstaben erzeugen. Fülle einen String mit allen Zeichen, die du verwenden möchtest. Dann erzeuge Zufallszahlen im Bereich der Länge dieses Strings und nutzt diese Zahlen dann als Indizes (Position im String).
    Das sind eher noch weniger als 10 Zeilen.



  • Du kannst auch weiterhin mit rand() arbeiten. Allerdings solltest du dir damit zufällig einen Index für den AnsiString generieren lassen und von der Position im AnsiString dann den char rausholen. Ungefähr so:

    AnsiString as("ABCDEF0123456");
    AnsiString serial;
    
      srand( (unsigned)time( NULL ) );
      for(int i = 0; i<6; ++i)
      {
        serial += as[(rand() % 6)+1];
      }
    


  • OK! Dass habe ich verstanden. Haette ich eigentlich echt selber drauf kommen können!

    merci



  • Hab gerade diesen Code:

    char buchstabe[26] = {"A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"};
    int X=0, Z=0;
    int ersetzen;
    char zeichen[5];
    Memo1->Lines->Clear();
    
        for (int l=0; l<1000; l++)                           // 4 Random Buchstaben aus der Liste Waehlen
          {
          X = (rand() % 2420);
          if ( Z<5 && X < 26)
            {
            zeichen[Z] = buchstabe[X];
            Z++;
            }
          }
    
    int wert1[15];                                      // 16 Zufaellige Zahlen generieren und in Array Schreiben
      int i=0;
    
        randomize();
        for(i=0; i<16; i++)
          {
          wert1[i] = (rand() % 10);
          }
    
    AnsiString  a, b, c, d, e, r, g, h, q, j, k, l, m, n, o, p;
    
      a = wert1[0];
      b = wert1[1];
      c = wert1[2];
      d = wert1[3];
      e = wert1[4];
      r = wert1[5];
      g = wert1[6];
      h = wert1[7];
      q = wert1[8];
      j = wert1[9];
      k = wert1[10];
      l = wert1[11];
      m = wert1[12];
      n = wert1[13];
      o = wert1[14];
      p = wert1[15];
    
       b = zeichen[1];
       r = zeichen[2];
       l = zeichen[4];
       n = zeichen[3];
       o = zeichen[0];
    

    durch diesen

    AnsiString pool = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    AnsiString serial;
     srand( (unsigned)time( NULL ) );
    
    for (int i=0; i<16; i++)
      {
        serial += pool[(rand() % 36 )+1];
      }
        Memo1->Lines->Add (serial);
    

    ersetzt...

    Beide machen genau dass gleiche, ausser dass der obere noch etwas zufaelliger is!
    KRASS! 😃



  • Das mit dem "etwas zufälliger" liegt daran, das die Zufallszahl anhand der Zeit generiert wird. Sie ist somit gar nicht wirklich zufällig. Aber wenn du willst, das immer unterschiedliche Buchstaben/Zahlen vorkommen, dann musst du "serial" zusätzlich noch mal auf den neuen Buchstaben prüfen und bei vorkommen eines gewählten Buchstaben, nochmal eine neue Zahl generieren.


Anmelden zum Antworten