Array größe ermitteln



  • Hallo wie kann ich hier rausfinden wie viele Zeichen ich als Parameter übergeben habe ?

    int main ( int argc , char* argv[] )
    {
    
            if ( argc == 1)
            {
                    cout<<"kein parameter";
                    return 0;
            }
    
    cout <<  argv [1] ;
    
    cin.get();
    


  • argv** sind \0 terminierte char arrays... wenn du also rausbekommst wie du die Länge von char * test = "dasIstEinTest\0"; bestimmst ... bist du fast fertig.



  • Ja aber was ist wenn ich Null Bytes als Parameter übergebe. 🤡


  • Mod

    Mit strlen kannst du die Länge von C-Strings (wie die Kommandozeilenargumente) herausfinden. Das ist das was du hier brauchst. Sei dir aber im klaren, dass dies nicht das gleiche ist wie die Länge eines Arrays herauszufinden. strlen ist eine komplexe Funktion, welche bestimmte Konventionen (Nullterminierung) bei C-Strings ausnutzt. Bei allgemeinen Arrays ist es nicht mehr möglich deren Länge nach Übergabe an eine Funktion (hier: main) herauszubekommen. Daher muss man allgemein bei Arrays immer die Größe mit übergeben (wie hier argc), wenn man es nicht mit C-Strings zu tun hat. Dies ist einer der vielen Gründe, warum in Klassen gekapselte Arrays (std::vector, boost::array) normalen Arrays weit überlegen sind und in C++ immer bevorzugt werden sollten. Hier hast du jedoch keine Wahl, da der Funktionskopf von main schon vorgegeben ist und aus Kompatibilitätsgründen nur C Mittel verwendet.

    len schrieb:

    Ja aber was ist wenn ich Null Bytes als Parameter übergebe. 🤡

    Versuch's doch mal. Tipp: Es geht nicht. Der String würde an der Stelle des Nullzeichens getrennt. Wenn du dennoch Strings mit Nullzeichen darin als Ganzes übergeben willst, musst du die Nullzeichen vor der Übergabe irgendwie codieren und dein Programm muss das dann wieder dekodieren.



  • Also kurz gesagt: Ich hab keine möglichkeit hier die Länge zu bestimmen ?


  • Mod

    len schrieb:

    Also kurz gesagt: Ich hab keine möglichkeit hier die Länge zu bestimmen ?

    😕 Du hast doch zwei richtige Antworten bekommen, die dir erklären wie es geht.



  • Ich hab jetzt so gemacht das funktioniert und ja stimmt bei Null Bytes wird der string sowieso beendet.

    #include <iostream>
    #include <windows>
    #include <sstream>
    using namespace std;
    
    int main ( int argc , char* argv[] )
    {
    string s;
    
            if ( argc == 1)
            {
                    cout<<"kein parameter";
                    return 0;
            }
    stringstream str ;
    
    str << argv[1];
    str >> s ;
    
    cout<< s.length();
    
    return 0;
    


  • #include <iostream>
    
    int main(int argc, char** argv)
    {
    	for(int i = 1; i < argc; ++i)
    	    std::cout << argv[i] << " ist " << strlen(argv[i]) << " Zeichen lang." << std::endl;
    }
    

    😉



  • Hi,

    ich muss gestehen, dass alle meine C++-Programme so anfangen:

    int main(int argc, char* argv[]) {
       vector<string> args(&argv[0], &argv[argc]);
    

    Da habe ich meine Argumente schön zugreifbar und fertig...
    Klar: Das braucht's nicht immer und überall und man darf sein Gehirn nie ganz ausschalten .... aber in 99,9% aller meiner Fälle ist es genau das Richtige. 😉 😃

    Gruß,

    Simon2.


Log in to reply