std::string terminieren



  • Hallo,

    wenn ich versuche mit \0 einen std::string zu terminieren wird der String trotzdem vollständig ausgegeben.

    std::string s = "Hallo";
    s[1] = '\0';
    std::cout << s;
    

    ergibt: H llo

    Was bleibt mir für eine andere Möglichkeit?



  • std::string str("hallo");
    str.erase(str.begin() + 1,str.end());
    


  • probier es auch mal mit der c-Fkt strncpy()
    char * strncpy(char * destination, const char * source, size_t n);
    dürfte auch für strings funkten

    obwohl: eigentlich sch....



  • freshman schrieb:

    probier es auch mal mit der c-Fkt strncpy()
    char * strncpy(char * destination, const char * source, size_t n);
    dürfte auch für strings funkten

    obwohl: eigentlich nicht elegant!

    Gib mal nen Beispiel wie Du das anwenden willst



  • lol, std::string gibt es ja extra um nicht mit den C-Strings und Terminierung sich befassen zu müssen.

    Schau dir mal std::string::substr an (in deiner lieblings C++ Referenz)

    @freshman
    *yuck*



  • 😞 😞 freshman.beingAshamed(very);
    //sorry, aber bitte nicht weitersagen, ja?!



  • Also...ich finde resize() hier am einfachsten, aber ich weiß ja nicht, wozu die Terminierung gut sein soll. Man kann natürlich immer schreiben:

    meinStr[4] = 0;
    cout << meinStr.c_str() << endl;
    

    Wenn es wirklich nur darum geht, einen String auszugeben, ohne ihn (bis auf die Terminierung) zu verändern... *schulterzuck*



  • Hier ein direkter Vergleich <cstring> gegen <string>, der die Überlegenheit von <string> unterstreicht:

    #include <cstring>
    #include <cstdio>
    #include <conio.h>
    
    char str[] =    "lazy";
    char string[] = "The quick brown dog jumps over the lazy fox";
    char fmt1[] =   "         1         2         3         4         5";
    char fmt2[] =   "12345678901234567890123456789012345678901234567890";
    
    int main( )
    {
       char *pdest;
       int  result;
       printf( "String to be searched:\n\t%s\n", string );
       printf( "\t%s\n\t%s\n\n", fmt1, fmt2 );
       pdest = strstr( string, str );
       result = pdest - string + 1;
       if( pdest != NULL )
          printf( "%s found at position %d\n\n", str, result );
       else
          printf( "%s not found\n", str );
       getch();   
    }
    
    #include <string>
    #include <iostream>
    using namespace std;
    
    int main()
    {
       string substr  = "lazy";
       string str     = "The quick brown dog jumps over the lazy fox";
       string fmt1    = "         1         2         3         4         5";
       string fmt2    = "12345678901234567890123456789012345678901234567890";
    
       cout << "String to be searched:" << endl << "\t" << str  << endl;
       cout << "\t" << fmt1 << endl << "\t" << fmt2 << endl << endl;
       int dest = str.find(substr);
       if (dest != -1)
         cout << "\"" << substr << "\"" << " found at position " << dest + 1 << endl;
       else
         cout << "\"" <<  substr << "\"" << " not found" << endl;  
       wait(); // siehe FAQ
    }
    


  • Verwendung von std::string::substr

    seh ich nicht



  • Richtig! ROFL 😃 😃 😃



  • Erhard Henkes schrieb:

    Hier ein direkter Vergleich <cstring> gegen <string>, der die Überlegenheit von <string> unterstreicht:

    überlegenheit würde ich es nicht nennen, ich würde da ohne wertung arbeiten.
    (egal, welcher algorithmus da im einzelnen gewinnt 😉 )
    für mich sind das unterschiedliche sachen, ob ich in c/c++ mit der string.h arbeite, oder die string klasse aus c++ nutze.


Anmelden zum Antworten