frage zu string::find



  • hallo,

    ich habe ein kleines problem mit meinem code:

    string Cpp2Html::replace(string *pStr) {
    ...
            if (pStr->substr(pos, 4) == "<" && pStr->substr(0, pos).find("#") != string::npos) 
                for (i = pos + 4; i < pStr->length(); i++)
                    if (pStr->substr(i, 4) == "&gt;") {
                        retStr = styleStr + pStr->substr(pos, i - pos + 4) + styleEnd;
                        pos += i - pos + 4;
                        return retStr;
                    }
    ...
    }
    

    es scheint so zu sein, dass pStr->substr(0, pos).find("#") immer was findet. das sollte nicht so sein. im debugger sehe ich, dass pStr über 2000 zeichen lang ist, dass kann eigentlich auch net sein.

    vector<string> *pInputStrs;
    ...
        for (unsigned int i = 0; i < pInputStrs->size(); i++) {
    		pos = 0;
    		lineNew.clear();
    		while (pos < (*pInputStrs)[i].length())
    			lineNew += replace(&(*pInputStrs)[i]);
    		pOutputStrs->push_back(lineNew);
    	}
    

    wenn pStr 2000 zeichen hat, kann ich nachvollziehen warum .find immer funktioniert. aber warum hat pStr so viele zeichen?

    (ich benutze vc 2008)



  • Warum machst du des alles mit Pointern? Da langen (fast) überall Referenzen, das machts dann etwas übersichtlicher. Man kann so auch nicht ganz erkennen was du erreichen willst und vor allem sagt dein geposteter code nichts drüber aus wie du die Strings in den vector packst, bzw. wie du die strings überhaupt aufbaust- Und letzteres sollte schon da stehen, wenn man rausfinden will warum so ein string 2000 Zeichen haben kann..



  • ich bin ein c anfänger, deswegen sieht es anders aus als du es vllt machen würdest^^ der code gehört zu einem programm, der code in gehighlightest html speichert.

    hier der code, der die strings einliest.

    ifstream inFile;
    ...
    	        inFile.open(inFileName.c_str());
    	        if (inFile.is_open()) {		
    		        while (getline(inFile, s)) 
    			        inputStrs.push_back(myStringReplace(myStringReplace(s, "<", "&lt;"), ">", "&gt;"));
    		        inFile.close();
    		        inFile.clear();
    


  • Zunächst solltest du mal prüfen ob der String überhaupt gültig ist, oder ob der Pointer evtl. irgendwo hin zeigt, nur nicht da wo er sollte 🙂



  • inFile.open(inFileName.c_str());
    	        if (inFile.is_open()) {		
                    while (getline(inFile, s)) {
                        //s = myStringReplace(s, "<", "&lt;");
                        //s = myStringReplace(s , ">", "&gt;");
    			        inputStrs.push_back(s);
                    }
    		        inFile.close();
    		        inFile.clear();
    
                    cout << inputStrs.size() << endl; // gibt 1 aus
    

    das problem scheint beim laden der daten zu entstehen, inputStrs.size() ist 1.
    im debugger kann ich sehen, das da wo das ende sein sollte nur ne 13 steht. wird die 10 verschluckt?

    //Edit:
    alles zurück, in der datei stehen schon keine vernünftigen umbrüche. kommt davon wenn man mit dich die dateien nur mit notepad++ anguckt...



  • btw hatte ich letztes mal im debugger(des msvc) extreme probleme, als ich mit vector<string> gearbeitet hatte - konnte den debugger-bug aber nicht reproduzieren - war nur in dem einen projekt so, dass der debugger müll angezeigt hat - so das ich mir dann testausgaben bauen musste um zu sehen, was wirklich drin steht etc...

    wollts nur mal erwähnt haben - wenns bei dir nicht so ist, kannste das einfach ignorieren^^

    bb


Anmelden zum Antworten