C# Strings an Konsolenanwendung übergeben

estre

Commander
Registriert
Dez. 2005
Beiträge
3.006
Hallo zusammen,

ich benötige Hilfe zu einer C# Konsolenanwendung.
Und zwar möchte ich nicht anderes tun als eine bestimmte Anzahl an Strings an das Programm zu übergeben.
Wichtig ist dabei, dass diese String später im Programm zu einem Array zusammengeführt werden (ich vermute mal, dass man ein Array nicht direkt übergeben kann)

So würde z.b. der Programmaufruf aussehen:
ConsoleApp.exe "Meier" "Mueller" "Schmitt" "Heinrich"

Was dann das Programm daraus machen müsste wäre folgendes:
Code:
string[] names = {"Meier","Mueller", "Heinrich"}


Könnt ihr mir da weiterhelfen?

Vielen Dank!

Grüße
 
Mit
Code:
string[] args = Environment.GetCommandLineArgs();
foreach (string arg in args)
{
   //...
}
bekommst du alle Kommandozeilen Argumente.
Der erste Eintrag ist allerdings der Programmname.

EDIT: Oder wie riddickx schon geschrieben hat, gehts bei Konsolenanwendungen noch einfacher, da die args schon übergeben werden.
 
Zuletzt bearbeitet: (zu langsam)
Hey,

wieso kompliziert, wenn es auch einfach geht....

Der Tipp mit args war goldwert, vielen Dank!

Beste Grüße
Ergänzung ()

_______________________________

Eine kurze Frage habe ich noch:
Im eigentlichen Programm übergebe ich natürlich keine simplen Namen sonndern ID’s von bestimmten Anwendungen. Diese sehen z.B. so aus:
"{7B4E1F3C-A702-11D2-A336-00C04F7978E0}\0\0"

Nun besteht noch das Problem, dass das Programm daraus folgendes macht:
"{7B4E1F3C-A702-11D2-A336-00C04F7978E0}\\0\\0"
(also mit insgesamt 4 "\")

Ich nehme an da fehlt irgendwo eine Maskierung, oder?!
Ich habe bisher folgendes probiert, was aber leider nicht geholfen hat:
@"{7B4E1F3C-A702-11D2-A336-00C04F7978E0}\0\0"


Habt ihr eine Idee?

Danke!

Grüße
 
Aus \ wird definitiv nicht automatisch \\. Da musst du die Werte schon falsch übergeben. Von wo übergibst du sie? Kommandozeile, anderes Programm, ...?
 
Hey,

zunächst mal danke für Deine Antwort!

die Werte sollen später mal über die Kommandozeile übergeben werden. Momentan übergebe ich sie direkt in Visual C# 2010 (in den Projekteigenschaften).

Grüße
 
Das mit den "\\" ist bei C# so.
Mit dem @ müsste schon richtig sein. Probier mal das @ nicht direkt in den Aufruf-Parameter zu stecken, sondern vor den Namen über den du darauf zugreifst (hier "args").

Z.B.:

string element = @array[0];
 
Hi,

@iks-deh:
Das hatte ich auch schon probiert, funktioniert leider ebenfalls nicht.

Aber trotzdem danke für Deinen Vorschlag!

Ich hab euch mal ein Bild angehängt wie sich das Problem darstellt, ist ein Auszug aus dem Debugmodus
 

Anhänge

  • Fehler.PNG
    Fehler.PNG
    165,7 KB · Aufrufe: 257
Zuletzt bearbeitet:
Hm. Ansonsten könntest du dir eine Methode schreiben, die zwei zusammenhängende \\ durch einen einzigen ersetzt.
 
Das stimmt doch so. \\ ist \, wenn es nicht so wäre, wäre es ein Null-Byte "\0". Um ein \ zu erhalten, muss es eben escaped werden, was \\ ergibt.
 
@Yuuri
Dann müsste aber in meinem Beispiel die Variable „has“ true sein oder nicht?!

Das Komische ist, dass wenn ich die Werte nicht als Parameter übergebe, sondern im Quellcode einfach ein Array mit den beiden Werten erstelle, funktioniert es einwandfrei.

Grüße
 
dcobra schrieb:
Nein, denn du musst natürlich nach ..\\0\\0 suchen und nicht nach ...\0\0

das Problem ist, dass ich die fehlenden Backslashs dort nicht einfach einbauen kann
Das oben genannte Beispiel ist nicht der wahre Quellcode. Dort wird der Wert als Eigenschaft aus einem Objekt gelesen, den kann ich nicht einfach nach belieben hart codiert dort eintragen.

Grüße
 
Dann ist die Eigenschaft des Objekts schon falsch. "\" ist in C# Strings (wie bei vielen anderen Sprachen auch) nun mal für das Einleiten einer Escapesequenz gedacht, will man "\" als String lautet es nunmal "\\".
 
Verstehe ich nicht. Wieso ist sie „falsch“, wenn sie halt nur aus einem „\“ anstatt zweien besteht?

Hier mal der Screenshot aus dem richtigen Quellcode bei der Variable applicationID handelt es sich um einen String, das habe ich vorher umgewandelt.
 

Anhänge

  • Fehler.PNG
    Fehler.PNG
    12,9 KB · Aufrufe: 167
Dein Application-ID String enthält keine "tatsächlichen" backslashes im Sinne einer darstellbaren Zeichenfolge. Das \0\0 sind wohl eine Art Zero-Bytes, das ist aber kein wirklicher Text den du über die Console eingeben könntest. Wenn du \0\0 über die Console eingibst, dann wird das natürlich als Text behandelt weil es auch solcher ist.

Entweder du entfernst die Zeichen aus dem Rückgabewert der Methode oder du fügst sie manuell hinzu an deinen Input, dann kannst du auch vergleichen.

edit: oder mit anderen Worten, deine ID lautet eigentlich

{7B4E1F3C-A702-11D2-A336-00C04F7978E0}

und nicht

{7B4E1F3C-A702-11D2-A336-00C04F7978E0}\0\0

Die Zerobytes am Ende sagen nur "hier ist Schluss", die sind nicht Teil des Namens.
 
Zuletzt bearbeitet:
Zunächst nochmal danke für deine Hilfe.

Ich denke ich verstehe was du meinst, aber warum die Prüfung auf true bei einem normalen Array funktioniert (das ja auch nur aus Strings besteht) ist mir noch nicht ganz klar.


Folgendes würde also klappen
Code:
string[] comIDs = { "{7B4E1F3C-A702-11D2-A336-00C04F7978E0}\0\0", "{BB646A8B-5F7F-4A8F-969B-22305B19FX4R}\0\0"
 };

und dann

Code:
string applicationID = GetString(appData.m_szAppGuid);

bool has = comIDs.Contains(applicationID);

hier würde has true ergeben. So habe ich es bisher auch gemacht...
 
So stimmt es ja auch, denn in deinem String steht "\0\0" und nicht "\\0\\0". Das hast du ja bereits selbst bemerkt.

Jetzt wird aber alles, was du über die Eingabe eingibst, als darstellbare Zeichenfolge angesehen. Logisch ist es darstellbar, denn du hast es ja explizit mit deinen Fingern so eingegeben. Da Backslashes String-Intern aber zum escapen benutzt werden und somit quasi schon reserviert sind, ist die Laufzeit hier besonders schlau und macht daraus ein doppeltes Backslash.

Dies hat zur Folge, dass wenn du die Eingabe wieder an den Benutzer ausgibst, sie genau so aussieht wie das was er eingegeben hat.

Seine Eingabe: \0\0
Interne Repräsentation; \\0\\0
Die Ausgabe auf der Kommandozeile: \0\0


Dein Problem ist aber jetzt, dass du die Backslashes gar nicht als darstellbare Zeichenfolge eingeben möchtest, sondern als Escapezeichen für die 0. Das resultierende \0 hat in deinem Programm nämlich eine spezielle Bedeutung und hat erstmal nichts mit darstellbarem Text zu tun.

Was machst du also?

Du könntest das "\0\0" im Quellcode adden. Also eingabe1 = args[1] + "\0\0".

Ich würde dir aber eher vorschlagen, dass du die "\0\0" aus dem Rückgabewert deiner GetString-Methode entfernst, weil in C# brauchst du für das Beenden deiner Strings keine Zero-Bytes. Die sind nur da weil es bei deiner verwendeten API (oder woher auch immer sonst appData.m_szAppGuid kommen mag) so Konvention ist.

Also eher applicationID = applicationID.Replace("\0", String.Empty) oder so.
 
Zuletzt bearbeitet:
estre schrieb:
Folgendes würde also klappen
Code:
string[] comIDs = { "{7B4E1F3C-A702-11D2-A336-00C04F7978E0}\0\0", "{BB646A8B-5F7F-4A8F-969B-22305B19FX4R}\0\0"
 };
Nein, lies dich bitte in Sachen Escapesequenzen irgendwo ein.

Entweder
Code:
string[] comIDs = { "{7B4E1F3C-A702-11D2-A336-00C04F7978E0}\\0\\0", "{BB646A8B-5F7F-4A8F-969B-22305B19FX4R}\\0\\0"
 };
oder
Code:
string[] comIDs = { @"{7B4E1F3C-A702-11D2-A336-00C04F7978E0}\0\0", @"{BB646A8B-5F7F-4A8F-969B-22305B19FX4R}\0\0"
 };
\n ist newline
\r ist carriage return
\\ ist backslash
\0 ist null byte

Deswegen wird mit einem Backslash escaped.
 
Zurück
Oben