std::string::rfind() und nullbyte



  • #include <string>
    
    int main()
    {
      std::string bla = "asdasd\0asd\0a";
      char suche = '\0';
    
      std::string::size_type found = bla.rfind(suche);
    }
    

    geht nicht? Oo
    poste mal nen compilierbares mini-bsp. von deinem versuch - ich versteh dein problem nicht so richtig -.-

    bb



  • unsigned int str_rmatch(const string &search, string &inputString, unsigned int startpos)
    	{
    		string::size_type pos = inputString.rfind(search, startpos);
    
    		if(string::npos == pos){
    			return -1;
    		} else {
    			return pos;
    		}
    	}
    
    std::string bla = "asdasd\0asd\0a";
    
    str_rmatch("\0", bla, string::npos);
    

    hier genau so wie ich es hab^^



  • 1700 schrieb:

    allerdings liefert mindestens "\0" und '\0' die gleichen ergebnisse - "\x0" bzw. '\x0' sicherlich auch...

    ja dachte ich eigentlich auch... tuts aber irgendwie nich. Also nochma
    wenn suche = "\0" geht es nicht wenn suche = '\0' gibts n fehler. Wenn ich in die funktion "\0" eintrage geht es nicht. Wenn ich in die funktion '\0' eintrage geht es.
    Und so: bla.rfind('\0')
    will ich das ja grade nich machen.... da soll ja trotzdem bla.rfind(suche)
    stehen.

    Wenn du als Argument der Funktion einen C-String angibst, ist das terminierende Nullbyte nicht Teil des Werts, nach dem gesucht wird (was eigentlich nicht weiter überraschen sollte). Wenn dein C-String selbst ein Nullbyte enthält, wird der String nur bis zu diesem Nullbyte ausgewertet. Somit ist bla.rfind("\0") dasselbe wie bla.rfind("").

    Stefan.



  • Hab den Code nicht weiter angesehen und nicht ausprobiert, aber das Nullbyte dient doch zur Terminierung eines Strings. Kann man überhaupt davon ausgehen, dass das Nullbyte gefunden werden kann? Der String ist ja an dieser Stelle als zu Ende gekennzeichnet.



  • strings können gut miz nullen drin umgehen. nur der kosntruktor string(char const* str) denkt sinnvollerwqeise , str sei nullterminiert.

    #include <string>
    #include <iostream>
    
    int main()
    {
      std::string bla = std::string("asdasd")+'\0'+"asd"+'\0'+"a";
      char suche = '\0';
    
      std::string::size_type found = bla.rfind(suche);
      std::cout<<found<<'\n';
      return 0;
    }
    

    oder

    #include <string>
    #include <iostream>
    
    int main()
    {
      std::string bla ("asdasd\0asd\0a",sizeof("asdasd\0asd\0a")-1);
      char suche = '\0';
    
      std::string::size_type found = bla.rfind(suche);
      std::cout<<found<<'\n';
      return 0;
    }
    


  • 1700 schrieb:

    std::string bla = "asdasd\0asd\0a";
    

    ...erzeugt ein std::string Objekt namens bla mit 6 Zeichen als Inhalt: asdasd

    Dazu wird der Konstruktor string(const char*) benutzt. Innerhalb dieses Konstruktors werden die Zeichen gezählt, bis die erste Null gefunden wird. Es sind dann 6 Zeichen (ausschließlich \0).

    Wenn Du mehr von dem Array im String drinhaben willst, kannst Du das so machen:

    static const char test[] = "asdasd\0asd\0a";
    std::string bla1 (test,test+sizeof(test));   // mit Null-Terminierung
    std::string bla2 (test,test+sizeof(test)-1); // ohne Null-Terminierung
    

    Gruß,
    SP



  • oh - nachdenken 4tw 😃
    danke 😉



  • ok ja... is ja alles richtig... mein string wird mit ifstream aus ner datei geladen aber is ja auch unwichtig^^
    was mir auf jeden fall immernoch keiner sagen konnte is wie ich mit der variable search ein nullbyte suchen kann und search als string definiert lassen kann. Das es mit char klappt is mir klar. Das muss doch aber auch irgendwie möglich sein das search ein std::string bleibt und rfind() dennoch ein nullbyte findet.



  • 1700 schrieb:

    ok ja... is ja alles richtig... mein string wird mit ifstream aus ner datei geladen aber is ja auch unwichtig^^
    was mir auf jeden fall immernoch keiner sagen konnte is wie ich mit der variable search ein nullbyte suchen kann und search als string definiert lassen kann. Das es mit char klappt is mir klar. Das muss doch aber auch irgendwie möglich sein das search ein std::string bleibt und rfind() dennoch ein nullbyte findet.

    Doch, eigentlich wurde gesagt, daß std::string suche("d\0a",3); geht und warum std::string suche="d\0a"; nicht geht.



  • alles klar war mein fehler sorry. Danke für die Hilfe jetzt klappt alles!


Anmelden zum Antworten