Array aus Strings mit unbekannter Größe deklarieren



  • Liebe Leute,

    ich arbeite gerade an einem Programm, das Strings nach Caesar Cipher codieren soll.

    Hierbei konvertiere ich den Plaintext String in ein char Array, konvertiere die Elemente des Arrays in den Ciphertext, speichere diesen ebenfalls in ein char Array und möchte dieses Array dann wieder in einen String konvertieren.

    Dies gelingt mir aber nur, wenn ich vorher weiß, wie viele Elemente das Array haben wird. Wie deklariere ich in C# ein char array in unbekannter Größe?

    Anebei ein Schnipsel des Codes für 3 Beispiel-Elemente, der die Frage hoffentlich illustriert:

    static void Main(string[] args)
            {
               //neu erstelltes char in array speichern und ausgeben
    
                string text = "abc";
                int key = 1;
                char[] array = text.ToCharArray();
                string ciphertext;
                char[] cipher = { '0', '0', '0' }; 
                // wie deklariere ich das array wenn ich vorher nicht weiß wie viele Elemente es haben wird
                char letter;
    
                for (int i = 0; i < array.Length; i++)
                {
                    letter = array[i];
                    letter = (char)(letter + key);
                    cipher[i] = letter;
                }
    
                string plaintext = new string(array);
                Console.WriteLine(array);
                ciphertext = new string(cipher);
                Console.WriteLine(cipher);
    
                Console.ReadLine();
            }
    

    Mein Zielprogramm soll später den String vom Nutzer einlesen und von dem weiß ich ja nicht im Voraus, wie lang dieser ist.

    Die anderen Probleme - nur Buchstaben zu codieren und diese wiederum nur zu Buchstaben usw. - habe ich in meinem Zielprogramm schon gelöst, aber bisher ist es mir nicht gelungen, das Ergebnis wieder in einem neuen String auszugeben.

    Beste Grüße,
    Yvonne



  • Yvonne1978 schrieb:

    Wie deklariere ich in C# ein char array in unbekannter Größe?

    Die Größe ist nicht unbekannt, cipher muss genauso groß wie array sein:

    char[] cipher = new char[array.Length];
    


  • Das ist richtig.
    Jetzt läuft das Programm, vielen Dank.

    Die Größe eines char arrays ist aber nicht immer schon bekannt? Da es in C# keine Zeiger gibt, fällt mir keine Lösung ein, das zu lösen, ich bin aber auch total neu in C#.



  • Im Zweifelsfall kannst du einfach eine Liste benutzen:

    List<char> liste = new List<char>();
    liste.Add('a');
    

    Und wenns dann dochmal das Array braucht:

    liste.ToArray();
    

    verwenden.



  • Für das Erzeugen von Strings bietet sich aber besser die StringBuilder-Klasse an:

    StringBuilder str = new StringBuilder();
    
    foreach (char c in text)
    {
       char letter = (char)(c + key);
       str.Append(letter);
    }
    
    string ciphertext = str.ToString();
    

    Wenn man die exakte oder ungefähre Größe schon kennt (so wie hier), so kann man als Performanceverbesserung des obigen Codes mittels

    new StringBuilder(text.Length);
    

    den internen Speicher schon mal reservieren lassen.



  • Vielen Dank, Listen waren mir noch komplett neu und vom StringBuilder habe ich gestern während meiner Recherchen erst erfahren.



  • Da ich nicht weis ob das Hausaufgaben sind und daher eine eigene Fehlersuche durchaus sinnvoll ist als es einfach zu spoilern:

    Das ist nicht die korrekte Implementierung des Caesar Ciphers.



  • Guten Tag,
    das ist ok, das war zwar eine Hausaufgabe, aber nur eine Vorversion, das finale Programm war später korrekt.
    Viele Grüße



  • Yvonne1978 schrieb:

    Wie deklariere ich in C# ein char array in unbekannter Größe?
    Yvonne

    Dafür gibt es in C# dynamische Listen aus dem Regal fix und fertig. Wenn man selbst solche Listen programmiert hat (C, C++), weiß man zu schätzen, wieviel Arbeit das spart. Die Größe ist praktisch nur durch den Arbeitsspeicher zur Laufzeit begrenzt.

    ArrayList arrl = new ArrayList(); // die dynamische Liste

    Codebeispiel:

    using System.Collections;
    
            public ArrayList lesen(string fname)  
               {
                   string buffer = "";
                   ArrayList arrl = new ArrayList();
                   try
                   {
                       StreamReader sw = new StreamReader(fname);
                       while ((buffer = sw.ReadLine()) != null)
                       {
                           arrl.Add(buffer);
    
                       }
                           sw.Close();
                       return arrl;
    
                   }
                   catch
                   {
    
                       Console.WriteLine("Hat nicht geklappt");
                       return arrl;
                   }
               }
    

    Die Funktion liest eine Datei aus und übergibt sie der ArrayList, welche sie als Rückgabetyp führt. Mit der methode arrl.Add ... wird die Liste dann befüllt.

    Pascal



  • Yvonne1978 schrieb:

    Die Größe eines char arrays ist aber nicht immer schon bekannt? Da es in C# keine Zeiger gibt, fällt mir keine Lösung ein, das zu lösen, ich bin aber auch total neu in C#.

    Naja, jain. Es war dein verwendetes Array gemeint, dem die Länge des Cipher anzugleichen ist.

    Was jedoch nicht richtig ist, ist die Aussage in deinem Betreff: "aus String mit unbekannter Größe". Die Größe des Strings ist dir bekannt. Du weißt was drin steht bzw. dein Programm weiß es. Aus dem String anschließend ein Array mit gleicher Größe erstellen ist dann auch kein Problem mehr.

    string myString = "Hallo Welt!";
    char[] myCharArray = new char[myString.Length];
    

    Hallo pascal2009,

    wenn du schon Listen vorschlägst, dann lass die ArrayList doch bitte in der Mottenkiste. - Diese heute noch vorzuschlagen, find ich fast schon frech. - Das gilt übrigens für alle untypisierten Listen.

    Was die Liste jetzt allerdings mit dem Thema zu tun haben soll ist mir wenig bis garnicht verständlich.



  • inflames2k schrieb:

    Was die Liste jetzt allerdings mit dem Thema zu tun haben soll ist mir wenig bis garnicht verständlich.

    Nun die Eingangsfrage nach einem array of Char ist eigentlich aus der Denke von c++ oder c, in c# gibt es string, und der String ist nicht als array of char definiert. C# ist nicht C.

    Das Problem, die Stringlänge von vornherein festzulegen, existiert so nicht, du kannst

    einen string undefinierter Länge mit dem += Operator beliebig verlängern

    (for int i =0 ..... i<20000 oder sonstwas, meinetwegen 40000 )
    string mystring +=char.

    Dann hast du einen String mit undefinierter Länge.

    Und kannst sie in Array List abspeichern, völlig egal, welche Länge die Strings haben. Das Problem ist natürlich irgendwie wie an den Haaren herbeigezogen, aber trotzdem ist es keines.

    Ich hab da ein bißchen vorausgedacht, daß man die Sachen ja auch speichern und zurücklesen können muß.

    Pascal



  • pascal2009 schrieb:

    Und kannst sie in Array List abspeichern, völlig egal, welche Länge die Strings haben.

    Hörst du bitte mit ArrayList auf?

    Seit fast 9 Jahren gibt es Generics. Es gibt keinen Grund, untypisierte Container zu benutzen, wenn du nicht gerade Windows 95 und/oder NT unterstützen musst.



  • pascal2009 schrieb:

    Das Problem, die Stringlänge von vornherein festzulegen, existiert so nicht

    🙄
    Strings in C# sind immutable. D.h. man kann die nachdem sie erzeugt wurden nicht mehr ändern.
    operator += erzeugt einen neuen String.

    string s = "123";
        List<string> li = new List<string>();
        li.Add(s);
        s += "456";
        Console.WriteLine(li[0]); // 123!
    

Anmelden zum Antworten