Parameter definierung der main Funktion, ein Zeichen zählen
-
Hi,
bei C++ stehen in der definierung der main Funktion immer int argc und char** argv. Ich möchte wissen für was der int ist und ob das argv wegen den zwei Sternen zwei Dimensional ist. Wie wird dann ein mehrzeiliger (getrennt durch char 13 und char 10) in das zwei Dimensionale char abgelegt?
Wie kann ich das vorkommen eines Zeichen in einem ein Dimiensionalen char zählen? Bleibt mir da nur die Möglichkeit mit der Funktion, die die erste bzw. leste Position des gesuchten Zeichens zurückgibt, und dann das ein Dimensionale Char jeweils kürzen und wieder mit vorheriger genannter Funktion suchen?
-
Windows schrieb:
Ich möchte wissen für was der int ist
Anzahl der Elemente in argv.
und ob das argv wegen den zwei Sternen zwei Dimensional ist.
Ja.
Wie wird dann ein mehrzeiliger (getrennt durch char 13 und char 10) in das zwei Dimensionale char abgelegt?
Mehrzeiliger was? Und was meinst du mit Trennung? In dem argv stehen die Kommandozeilenargumente als nullterminierte C-Strings. Der erste ist argv[0] (per Konvention der Name des Programms), die folgenden sind argv[1] (das erste Kommandozeilenargument, wenn es welche gibt) bis argv[argc-1].
Wie kann ich das vorkommen eines Zeichen in einem ein Dimiensionalen char zählen? Bleibt mir da nur die Möglichkeit mit der Funktion, die die erste bzw. leste Position des gesuchten Zeichens zurückgibt, und dann das ein Dimensionale Char jeweils kürzen und wieder mit vorheriger genannter Funktion suchen?
Guck dir nochmal die Grundlagen von C-Strings an, das ist alles sehr verwirrend und du benutzt falsche Ausdrücke. Wenn ich richtig rate, was du meinst: Geh den C-String durch (er endet mit 0) und guck bei jedem Zeichen, ob es das gesuchte ist.
Da du offensichtlich Anfänger bist: Versuche dich von C-Strings allgemein fern zu halten. Benutze den viel einfacher handhabbaren std::string.
-
Was ist std::string? Ich kann und möchte mit net Framework nicht arbeiten.
Also int gibt die anzahl der vorhandenen ersten Dimension zurück? Wozu soll das gut sein?
Also an sich hätte ich jetzt einfach ein Zeichen gezählt in dem ich nach dem ersten vorkommen von Links suche. Kommt eine Positionsangabe zurück, ist klar das es wahr ist, also erhöhre ich das Vorkommen um eins, dann schneide ich dort den char ab (Plus 1 natürlich) und suche wieder nach dem ersten vorkomen von links in dem beschnittenen char. Kommt wieder eine Positionsangabe zurück, ist klar das es wahr ist, also erhöhre ich das Vorkommen um eins, dann schneide ich dort den char ab (Plus 1 natürlich) und suche wieder nach dem ersten vorkomen von links in dem beschnittenen char. usw... erste wenn einmal keine Positionsangabe zurückkommen sollte ist klar, dass die Zählung beendet ist.
Aber dazu muss ich erst wissen wie die Parameter von der Console aus dem argv übergeben werden. Warum ist dieses char zwei Dimensional wenn eine Zeichenkette doch nur eine Dimension braucht?
-
#include <iostream> using namespace std; int main (int argc, char* argv[]) { for(int i = 0; i < argc; ++i) cout << argv[i] << endl; }wenn das programm so gestartet wird:
"run prog.exe -heigth 1024 -width 768 -sv_cheats 1"
dann steht in argv folgendes:char* argv[] = { "-heigth", "1024", "-width", "768", "sv_cheats", "1" }; int argc = 6;es kann sein (ich bin mir da nicht sicher) dass auch noch der gesamte pfad zur datei mit angegeben ist
-
Da Du Dich hier im Unterforum C++ befindest, gehen wir mal davon aus, daß Du C++ programmieren möchtest und nicht C.
std::string ist die Standardklasse für Strings in C++, darauf bezog sich SeppJ.
Die Übergabe der Anzahl der ersten Dimensionen ist dafür gut, daß ich im Programm feststellen kann, mit wieviel Argumenten mein Programm aufgerufen worden ist.
Beispiel:
prog.exe eins zwei
argc == 3
argv[0] == "prog.exe"
argv[1] == "eins"
argv[2] == "zwei"
-
argv ist ein Feld von nullterminierten (w)chars. Du kannst sie folgendermaßen auslesen.
if(argc>1) { for(int i=1;i<argc;++i) cout << argv[i] << std::endl; }Bei den Paramtern Hallo dies sind die Parameter
ensteht so folgende AusgabeHallo dies sind die Parameter
-
Das Beispiel ist schon sehr verständlich. Warum aber z.B. war das char bei mir zwei Dimensional und was würde das bewirken bei einer Parameterübergabe?
Kann ich also z.B. einfach EOF verwenden um ein, ein Dimensionales Char per for Schleife durchzulaufen um jedes Feld auf ein Match zu pürfen?
-
Windows schrieb:
Was ist std::string? Ich kann und möchte mit net Framework nicht arbeiten.
Kennst du das schon?
http://lmgtfy.com/?q=c%2B%2B+std%3A%3Astring
Ich empfehle kein .NET im C++ Forum. Wenn du std::string nicht kennst, fehlen dir aber ganz grundlegende Sprachelemente von C++. Wie behandelst du Zeichenketten denn bisher? Als C-String (also nullterminierte char-Arrays?)Also int gibt die anzahl der vorhandenen ersten Dimension zurück? Wozu soll das gut sein?
Dann sag mir doch mal, wie man dem argv sonst die Anzahl der Elemente ansehen soll? Merkste was? Geht nämlich gar nicht anders.
Also an sich hätte ich jetzt einfach ein Zeichen gezählt in dem ich nach dem ersten vorkommen von Links suche. Kommt eine Positionsangabe zurück, ist klar das es wahr ist, also erhöhre ich das Vorkommen um eins, dann schneide ich dort den char ab (Plus 1 natürlich) und suche wieder nach dem ersten vorkomen von links in dem beschnittenen char. Kommt wieder eine Positionsangabe zurück, ist klar das es wahr ist, also erhöhre ich das Vorkommen um eins, dann schneide ich dort den char ab (Plus 1 natürlich) und suche wieder nach dem ersten vorkomen von links in dem beschnittenen char. usw... erste wenn einmal keine Positionsangabe zurückkommen sollte ist klar, dass die Zählung beendet ist.
Häh? Was willst du überhaupt machen?
Aber dazu muss ich erst wissen wie die Parameter von der Console aus dem argv übergeben werden. Warum ist dieses char zwei Dimensional wenn eine Zeichenkette doch nur eine Dimension braucht?
Ich glaube ich weiß nun, was du nicht verstehst: Ein char ist keine Zeichenkette, sondern ein einzelnes Zeichen. Zeichenketten werden in C (und die Übergabe der main-Funktion ist aus Gründen der Kompatibilität wie in C geschaffen, in C++ würde man wie gesagt eigentlich std::strings übergeben) durch char-Arrays repräsentiert, hier als Zeiger auf das erste Element, also char*. Da für jedes Kommandozeilenargument ein char* nötig ist, hat man ein ganzes Array von char*, also char**. char[0] ist daher ein char* und zeigt auf das erste Element des ersten Kommandozeilenarguments (wie gesagt, immer der Programmname selbst).
Irgendwie habe ich aber das Gefühl, dass dir so viele Grundlagen fehlen, dass du diese Antwort gar nicht verstehst
. Einfacher kann ich es aber nicht erklären, ohne Bildchen zu malen. Bevor ich das mache, solltest du dich aber erstmal besser informieren, dazu gehört auch die Bemühung von Google bei solch einfach recherchierbaren Fragen wie "Was macht der int?" und "Was ist std::string?".
-
SeppJ schrieb:
Windows schrieb:
Was ist std::string? Ich kann und möchte mit net Framework nicht arbeiten.
Kennst du das schon?
http://lmgtfy.com/?q=c%2B%2B+std%3A%3Astring
Ich empfehle kein .NET im C++ Forum. Wenn du std::string nicht kennst, fehlen dir aber ganz grundlegende Sprachelemente von C++. Wie behandelst du Zeichenketten denn bisher? Als C-String (also nullterminierte char-Arrays?)Also int gibt die anzahl der vorhandenen ersten Dimension zurück? Wozu soll das gut sein?
Dann sag mir doch mal, wie man dem argv sonst die Anzahl der Elemente ansehen soll? Merkste was? Geht nämlich gar nicht anders.
Also an sich hätte ich jetzt einfach ein Zeichen gezählt in dem ich nach dem ersten vorkommen von Links suche. Kommt eine Positionsangabe zurück, ist klar das es wahr ist, also erhöhre ich das Vorkommen um eins, dann schneide ich dort den char ab (Plus 1 natürlich) und suche wieder nach dem ersten vorkomen von links in dem beschnittenen char. Kommt wieder eine Positionsangabe zurück, ist klar das es wahr ist, also erhöhre ich das Vorkommen um eins, dann schneide ich dort den char ab (Plus 1 natürlich) und suche wieder nach dem ersten vorkomen von links in dem beschnittenen char. usw... erste wenn einmal keine Positionsangabe zurückkommen sollte ist klar, dass die Zählung beendet ist.
Häh? Was willst du überhaupt machen?
Aber dazu muss ich erst wissen wie die Parameter von der Console aus dem argv übergeben werden. Warum ist dieses char zwei Dimensional wenn eine Zeichenkette doch nur eine Dimension braucht?
Ich glaube ich weiß nun, was du nicht verstehst: Ein char ist keine Zeichenkette, sondern ein einzelnes Zeichen. Zeichenketten werden in C (und die Übergabe der main-Funktion ist aus Gründen der Kompatibilität wie in C geschaffen, in C++ würde man wie gesagt eigentlich std::strings übergeben) durch char-Arrays repräsentiert, hier als Zeiger auf das erste Element, also char*. Da für jedes Kommandozeilenargument ein char* nötig ist, hat man ein ganzes Array von char*, also char**. char[0] ist daher ein char* und zeigt auf das erste Element des ersten Kommandozeilenarguments (wie gesagt, immer der Programmname selbst).
Irgendwie habe ich aber das Gefühl, dass dir so viele Grundlagen fehlen, dass du diese Antwort gar nicht verstehst
. Einfacher kann ich es aber nicht erklären, ohne Bildchen zu malen. Bevor ich das mache, solltest du dich aber erstmal besser informieren, dazu gehört auch die Bemühung von Google bei solch einfach recherchierbaren Fragen wie "Was macht der int?" und "Was ist std::string?".Seit wann kann man bitte schön nicht die anzahl der Elemente eines ein Dimensionalen Chars zählen? Merkste was?
-
Mach mal vor. Hier ich geb dir einen Funktionskopf:
int anzahl_elemente(char array[]) { return // Was nun? }Und selbst wenn du jetzt eine Lösung mit nullterminierung bastelst: Mach mal in 2D.
Wenn du pampig wirst ohne nachzudenken vergraulst du schnell alle Helfer.
-
SeppJ schrieb:
Mach mal vor.
Wenn man mit einem Element die zeichen vor einem "," meint, dann müsste man einfach nach dem "," suchen und bis dahin (minus 1 natürlich) abschneiden. Aber wahrscheinlich wird es die Console auch genauso machen. Zu managent einfach die Übergabe, abhängig von dem C String die der Mensch angibt.
-
Ein eindimensionales Array von char - Werten muß aber nicht zwangsläufig ein Komma enthalten. Es muß auch nicht zwangsläufig ein '\0' enthalten.
Wie also soll man die Länge feststellen, wenn man keine Ahnung hat, welche Zeichen drin sind, bzw. welches Zeichen das letzte im Array ist?
Das ist die Frage, die Dir SeppJ gestellt hat.
-
Belli schrieb:
Ein eindimensionales Array von char - Werten muß aber nicht zwangsläufig ein Komma enthalten. Es muß auch nicht zwangsläufig ein '\0' enthalten.
Wie also soll man die Länge feststellen, wenn man keine Ahnung hat, welche Zeichen drin sind, bzw. welches Zeichen das letzte im Array ist?
Das ist die Frage, die Dir SeppJ gestellt hat.Also mal angenommen das Char (was durch die menschliche Eingabe über die Console resultiert) hat kein \0 (was ich nicht verstehe warum das so sein sollte?), wie soll dann die Console erkennen wo das ende ist? Also muss es ein \0 geben!
-
Argc schrieb:
argv ist ein Feld von nullterminierten (w)chars.
Du musst es dir folgendermaßen vorstellen, wie argv im Speicher liegt:
Programmname\01.Paramter\02.Paramter\0 ab hier steht sonstwas im SpeicherWobei \0 die Escapesequenzen sind. D.h., du musst die Anzahl von argv kennen, um etwas sinnvolles damit anstellen zu können (siehe die vorigen Posts).
-
Argc schrieb:
Argc schrieb:
argv ist ein Feld von nullterminierten (w)chars.
Du musst es dir folgendermaßen vorstellen, wie argv im Speicher liegt:
Programmname\01.Paramter\02.Paramter\0 ab hier steht sonstwas im SpeicherWobei \0 die Escapesequenzen sind. D.h., du musst die Anzahl von argv kennen, um etwas sinnvolles damit anstellen zu können (siehe die vorigen Posts).
Nach dem Beispiel zeigte aber argc die anzahl der Elemente (getrennt durch ,) und nicht die Anzahl der Felder des C String.
-
Windows schrieb:
Belli schrieb:
Ein eindimensionales Array von char - Werten muß aber nicht zwangsläufig ein Komma enthalten. Es muß auch nicht zwangsläufig ein '\0' enthalten.
Wie also soll man die Länge feststellen, wenn man keine Ahnung hat, welche Zeichen drin sind, bzw. welches Zeichen das letzte im Array ist?
Das ist die Frage, die Dir SeppJ gestellt hat.Also mal angenommen das Char (was durch die menschliche Eingabe über die Console resultiert) hat kein \0 (was ich nicht verstehe warum das so sein sollte?), wie soll dann die Console erkennen wo das ende ist? Also muss es ein \0 geben!
Ja, Du hast in diesem Fall ja auch den Spezialfall, daß in Deinem char - Array ein C-String liegt. Ein C-String ist per Definition Nullterminiert.
Aber ein char - Array muß nicht zwangsläufig einen C-String enthalten, und ein ganz allgemeines eindimensionales Array von einem beliebigen Datentyp erst recht nicht! Und deshalb kann man die Länge eines Arrays nicht bestimmen.
-
Klar in argv stehen natürlich nur die Speicheradressen.
-
Belli schrieb:
Ja, Du hast in diesem Fall ja auch den Spezialfall, daß in Deinem char - Array ein C-String liegt. Ein C-String ist per Definition Nullterminiert.
Nachtrag:
char c_string[100]; strcpy(c_string, "hallo");1. Wieviel Elemente hat denn jetzt das Array?
2. Wie stellst Du diese Anzahl in einer Funktion fest, der ich dieses Array übergebe?
-
Also die Console übergibt einfach ein riesiges Array an argv? Warum denn das? Warum übergibt es nicht einfach ein Array was so groß ist wie die anzahld er Elemente? Komischer Consolen Erfinder!
-
Die Konsole übergibt ein Array von char - Zeigern und die Anzahl der übergebenen char - Zeiger. Jeder der übergebenen char - Zeiger zeigt auf ein Array von chars, das mit einem 0 - Zeichen beendet wird.
Wer hat was von 'riesig' geschrieben?