Problem: argv und string



  • Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI C in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • beispiel?

    du suchst einfach nach strlen.

    dann beschreibe, was du auf deiner suche gefunden hast.

    oder du benutzt C++ strings.



  • gewi schrieb:

    ...
    int main(int argc,char *argv[])
    Dieses argv soll in einem string
    ...
    gespeichert werden...

    Dann tu's doch:

    #include <iostream>
    using std::cout;
    
    #include <string>
    using std::string;
    
    #include <vector>
    using std::vector;
    using std::size_t;
    
    int main(int argc,char *argv[]) {
       string a = argv[5];
       cout << a << "\n";
    
       // oder gleich alle:
       vector<string> parms;
       for(size_t i=0; i<=argc; ++i)  // ich nehmen den PGNamen gleich mit
          parms.pushback(argv[i]);
    
       cout << parms[5] << "\n";
    
       return 0;
    }
    

    Gruß,

    Simon2.



  • inwiefern soll mir strlen weiterhelfen?
    strlen gibt mir doch nur die Länge eines Strings an?

    Ich will argv[5] in char aaa[] speichern.
    aaa[]=argv[5];

    ZB wenn ich ein Programm mit den Parametern "1 2 3 4 haus" starte habe ich in argv[5] "haus", wie kann ich das in den string aaa speichern, so dass es so aussieht:
    aaa[500]={'h','a','u','s'};
    ?

    Aber mit dem =-Operator geht es nicht, wie würdet Ihr das machen?

    Für einen Beispiel-Source-Code wäre ich dankbar.

    mfg gewi



  • gewi schrieb:

    ...
    Für einen Beispiel-Source-Code wäre ich dankbar.

    mfg gewi

    Mehr als den von mir schon gegebenen (vollkommen korrekten, kurzen, verständlichen, einfachen, sicheren, ...) werde ich nicht posten.

    Gruß,

    Simon2.

    P.S.: Wenn Du irgendwann mal einen (char const*) auf die Daten brauchst, ist string::c_str() Dein Freund.



  • ich will keinen string der c++-Bibliotheken nehmen, aber gibt es eine Möglichkeit, wie ich das als c-string verwirkliche?
    zB: aaa[500]={'h','a','u','s'};



  • gewi schrieb:

    ich will keinen string der c++-Bibliotheken nehmen,...

    Warum nicht ?
    Warum nimmst Du dann cout "aus den c++-Bibliotheken" ?
    Falls Du es nicht weisst: std::string gehört genauso zum Standard wie char*...

    ich jedenfalls habe keine Lust, dasselbe nochmal mühsam falsch zu machen, was Andere bereits (besser und) richtig gemacht haben. 😃

    Gruß,

    Simon2.



  • ich nehme Funktionen und Konventionen der c-Sprache, da diese schneller sind, und der restliche Code auch so aufgebaut ist(teils c, teils c++)

    ich will nicht unbedingt etwas nachprogrammieren, was Andere schon gemacht haben, aber wie kann ich ein argv in einem c-String speichern?



  • gewi schrieb:

    ich nehme Funktionen und Konventionen der c-Sprache, da diese schneller sind

    Schwachsinn.

    und der restliche Code auch so aufgebaut ist(teils c, teils c++)

    Schreibst Du Aufsätze/Artikel/Veröffentlichung auch halb in Deutsch, halb in Englisch?

    ich will nicht unbedingt etwas nachprogrammieren, was Andere schon gemacht haben

    Eben. Deswegen verwendet man (Standard-)Bibliotheken.



  • wie wäre es eigentlich wenn du dir das bereits erwähnte strcpy ansiehst?



  • ich meinte strcpy, nicht strlen.
    aber ich hatte schond as erste mal strcpy gesagt.

    also machs bitte jetzt auch.



  • printf ist schneller als cout, da es keine Klassen verwendet.

    das halb c halb c++ ist mein Stil zu Programmieren, vielleicht ist es nicht nachvollziehbar, aber wenn, dann ist das mein Problem, aber Danke für den Hinweis 🙂

    soviel ich weiß gibt es in den Standartbibliotheken auch keine Funktion, um argv in einem c-String zu speichern



  • gewi schrieb:

    printf ist schneller als cout, da es keine Klassen verwendet.

    Mann, Du hast ja wirklich die Weisheit mit dem Löffel gefressen. Mal im ernst: das ist patenter Quatsch. Klassen sind *nicht* a priori langsamer als Funktionen.

    soviel ich weiß gibt es in den Standartbibliotheken auch keine Funktion, um argv in einem c-String zu speichern

    Doch. 'std::strcpy'. Wie jetzt schon mehrmals gesagt worden ist.



  • gewi schrieb:

    printf ist schneller als cout, da es keine Klassen verwendet.

    Autsch.

    gewi schrieb:

    das halb c halb c++ ist mein Stil zu Programmieren, vielleicht ist es nicht nachvollziehbar, aber wenn, dann ist das mein Problem, aber Danke für den Hinweis 🙂

    Es wird zu "unserem" Problem wenn du hier im Forum schreibst.

    gewi schrieb:

    soviel ich weiß gibt es in den Standartbibliotheken auch keine Funktion, um argv in einem c-String zu speichern

    Lern lesen.



  • tut mir Leid, das erste strlen hat mich verwirrt, mit strcpy geht es, vielen Dank 🙂 man lernt echt nie aus

    Zu dem Punkt, dass c schneller als c++ ist:
    Ich habe ein Programm geschrieben, dass mir alle Zahlen von 1-10^7 in eine Datei schreibt. Dabei hat es c++ (ofstream) verwendet und die Zeit gemessen, und diese ausgegeben (mit printf). Dann wieder die gleichen Zahlen mit fprintf in eine Datei geschrieben, und die dafür benötigte Zeit mit printf ausgegeben, deswegen bin ich der Auffassung, dass c schneller als c++ ist.

    mfg gewi



  • Dann programmiere doch gleich in C, wenn es deiner mEinunge nach so viel schneller ist.



  • gewi schrieb:

    Ich habe ein Programm geschrieben, dass mir alle Zahlen von 1-10^7 in eine Datei schreibt. Dabei hat es c++ (ofstream) verwendet und die Zeit gemessen, und diese ausgegeben (mit printf). Dann wieder die gleichen Zahlen mit fprintf in eine Datei geschrieben, und die dafür benötigte Zeit mit printf ausgegeben, deswegen bin ich der Auffassung, dass c schneller als c++ ist.

    Ja, darum gab es auch schon einige Diskussionen im Forum. Zwei Bemerkungen dazu:

    - Diese Ergebnisse sind je nach verwendetem Compiler und verwendeter Implementierung der Standardbibliothek *stark* unterschiedlich. Mal ist das eine schneller, mal das andere. Es gibt an sich keinen Grund, wieso C++-Streams langsamer sein sollten als C-Methoden.

    - Der Grund, aus dem C++-IO theoretisch langsamer sein *könnte* ist der, dass die C++-IO-Klassen virtuelle Funktionen verwenden. Virtuelle Funktionen sind in der Tat langsamer als "normale" Methoden. Allerdings ist das in diesem Fall nicht ausschlaggebend.
    Mit Klassen hat das aber in keinem Fall etwas zu tun. Die Verwendung von Klassen macht einen Code *nicht* langsamer.



  • ich habe MSVC++ verwendet

    ok, dann habe ich wieder etwas dazu gelernt: c++ und c sind in etwa gleich schnell, die Unterschiede sind vernachlässigbar klein oder je nach Compiler anders. Danke für diese Info

    mfg gewi



  • lässt sich so pauschal auch nicht sagen. viele reinen c-methoden, gerade diejenigen, die direkt auf dem speicher arbeiten, sind rasend schnell. aber das sind dinge, um die man sich nen kopf machen kann, wenn man in der lage ist, robuste und effiziente programme zu designen. das ist ein langwieriger prozess, der jahre dauert. und erst wenn man diesen stand erreicht hat, dann lohnt es sich, mal auf "mikrooptimierungen" zu achten. aber bevor man soweit ist, sollte man lieber auf standards zurückgreifen, die das problem anständig lösen. wenn vielleicht auch ne halbe sekunde langsamer.



  • gewi schrieb:

    tut mir Leid, das erste strlen hat mich verwirrt, mit strcpy geht es, vielen Dank 🙂 man lernt echt nie aus

    Zu dem Punkt, dass c schneller als c++ ist:
    Ich habe ein Programm geschrieben, dass mir alle Zahlen von 1-10^7 in eine Datei schreibt. Dabei hat es c++ (ofstream) verwendet und die Zeit gemessen, und diese ausgegeben (mit printf). Dann wieder die gleichen Zahlen mit fprintf in eine Datei geschrieben, und die dafür benötigte Zeit mit printf ausgegeben, deswegen bin ich der Auffassung, dass c schneller als c++ ist.

    mfg gewi

    öh, schreib das Programm nochmal, aber lass das schreiben der Zahlen in die Datei via Template-Metaprogrammierung erledigen und schau mal dann, was bei der Ausführung schneller ist 😃


Anmelden zum Antworten