Wie kann ich comparsion Fehler/Warnung verhindern?



  • Diese Funktion zum erstezten der $-Zeichen verursacht bei mir immer diese Warnung:

    warning: comparison between signed and unsigned integer expressions
    
    ...
    str = "$Ausgabe von Irgendwo$";
    	while (str.find("$") !=-1) 
    	str.replace(str.find("$"),1 ,"")
    ...
    

    Es wird zwar durchkompiliert aber gefällt mir so nicht! Wie kann ich das verhindern?



  • indem du mit dem richtigen Wert vergleichst:

    while (str.find("$") !=string::npos) 
      str.replace(str.find("$"),1 ,"")
    

    (zur Erklärung: string::find() liefert den Index des gefundenen Zeichens als size_t-Wert (und das ist ein unsigned-Typ). npos (die offizielle Kennung für "gibt's nicht") ist zwar in der Regel als -1 definiert - aber konvertiert nach size_t.



  • dein Code ist zwar kurz aber nicht vollkommen korrekt und unperformant.

    void replace_char(std::string& string, const char find, const char repl)
    {
    	if (find == repl)
    		return;
    
    	std::string::size_type pos = string.find_first_of(find);
    	while (pos != std::string::npos)
    	{
    		string.replace(pos, 1, 1, repl);
    		pos = string.find_first_of(find, pos + 1);
    	}
    }
    

    ersetzen ..

    void delete_char(std::string& string, const char find)
    {
    	std::string::size_type pos = string.find_first_of(find);
    	while (pos != std::string::npos)
    	{
    		string.erase(pos, 1);
    		pos = string.find_first_of(find, pos);
    	}
    }
    

    ... löschen ...

    int main()
    {
    	std::string string_test("$Test$");
    	std::cout << string_test << std::endl;
    	replace_char(string_test, '$', '"');
    	std::cout << string_test << std::endl;
    	delete_char(string_test, '"');
    	std::cout << string_test << std::endl;
    	return 0;
    }
    

    .. nutzen. Gibt keinerlei Warnmeldungen ... und ist sauberer Code.

    Edit
    Hab jetzt löschen reingemacht ...



  • Super danke!
    Funktioniert.



  • @DEvil: Er wollte die $ aber nicht durch Leerzeichen überschreiben, sondern löschen (und für deine Anwendung wäre std::replace() wohl noch kürzer ;))

    @dixdix: Aber in einem Punkt hat DEvil recht - du mußt die Zielposition nicht doppelt berechnen (und anstatt die Teile gegen "" zu ersetzen, kannst du sie auch per erase() löschen).



  • @CStoll Ok, aber war eigentlich eher als Beispiel zu verstehen, Trotzdem danke für den Hinweis.



  • CStoll schrieb:

    @dixdix: Aber in einem Punkt hat DEvil recht - du mußt die Zielposition nicht doppelt berechnen (und anstatt die Teile gegen "" zu ersetzen, kannst du sie auch per erase() löschen).

    string& erase( size_type index = 0, size_type num = npos );
    

    Da muss ich doch nochmal nachhaken: ist die earse()-Methode dann nicht aufwändiger bzw. genauso aufwändig, da so wie ich das sehe mit erase() ein genaues Ziel verlangt wird. Insofern müsste man doch auch mehrmals berechnen, oder wie würde das aussehen?



  • Guck doch mal meinen Beitrag an. Hab dir extra noch nen Beispiel hinzugefügt gehabt wo die Benutzung gezeigt wird.



  • Ah ja, stimmt!


Anmelden zum Antworten