strncpy-Problem



  • Hallo, ich habe mal eine Frage zur Verwendung von strncpy. Was passiert denn mit den restlichen 250 Zeichen von rn? Sind die alle 0 oder wird rn nach dem fünften Zeichen abgeschnitten? Mir geht es nämlich darum keinen unnötigen Speicher zu belegen. Kann man das rn array evtl. auch dynamisch der Länge (text - name) anpassen?

    char rn[255];
    	//strncpy(rn, name, text - name);
    	strncpy(rn, "1234567890abcdef", 5);
    	rn[5] = 0;
    


  • Student83 schrieb:

    Kann man das rn array evtl. auch dynamisch der Länge (text - name) anpassen?

    Ja mit std::string.



  • Eine Möglichkeit ist dieses hier.

    char text[] = "1234567890abcdef";
    

    Aber wenn du diesen Text nicht wirklich als char vorligen haben musst, ist es in c++ besser einen std::string zu verwenden. std::string sagt es ja selber. ^^

    #include <string>
    using namespace std;
    
    string text("1234567890abcdef");
    


  • Ich bin mir nicht sicher ob das mit std::string geht. Und zwar lese ich eine Xml-Datei ein und streame den Inhalt in dieser Variable

    std::vector<char> data;
    

    .

    Übergeben wird das ganze dann folgendermaßen an z.B. die Funktion ParseDocument

    void ParseDocument(char *text);
    ParseDocument(&data[0]); // Aufruf
    

    Ich kann dann z.B. prüfen ob der char('>') vorkommt oder nicht:

    if (*text == char('>'))
    	{
    		++text;
    


  • du kannst die Datei auch in einen std::string-std::vector einlesen und dort mit z.B. mit der Methode find() den String auf ein '<' prüfen.

    Dein Ansatz ist C du solltest dich mehr mit der STL beschäftigen. Diese bietet dir viel einfachere und solidere Möglichkeiten deine Probleme zu lösen.



  • Verändert ParseDocument text?
    Wahrscheinlich nicht, also kannst du schreiben

    void ParseDocument(const char *text);
    
    void f()
    {
      std::string s = "Mein Text";
      ParseDocument(s.c_str());
      // oder, wenn du nur die Häufigkeit eines Buchstabens zählen möchtest
      size_t i = std::count(s.begin(),s.end(),'x'); (aus <alorithm>)
    }
    

Log in to reply