strcat verwirft int wert



  • Hi,

    ich hab folgendes Problem:

    int zähler=0;
    
    char fct[]="";
    while (cFct) {
    	zähler++;
    	char c = GetChar();
    	if (c != bracketFct.bra)
    		const char *fct = GetString(c);
    	else {
    		c = GetChar();
    		const char *_fct = GetString(c);
    
    		if (zähler == 1) {
    			g = funktion::type(std::string(_fct));
    			strcat(fct, _fct); <----
    		}
    		else {
    			funktion::types h = funktion::type(std::string(_fct));
    			if (h == g) {
    				strcat(fct, _fct);
    			}
    		}
    	}
    }
    

    Außerhalb der while-Schleife wird der int zähler definiert und initailisiert.
    In Zeile 15 wird eine String operation druchgeführt die die int-Variable eingentlich nicht tangiernen sollte. Das tut sie aber dennoch und ändert die Variable in einen undbestimmten Wert.

    Weiß jemand warum das so passiert und wie ich es vermeinden kann sodass die Zähler-Variable ihren zweck erfüllen kann, die Schleifendurchläufe zu protokollieren?



  • Du hast keinen (bzw. nicht genug) Speicherplatz für 'fct' reserviert (und dadurch überschreibst du andere lokale Variablen wie z.B. 'zähler').

    Aber warum überhaupt mit den C-Funktionen hantieren, wenn du C++ benutzt (die std:string-Klasse kann das alles viel komfortabler)?

    PS: Der Code kommt mir doch sehr bekannt vor 😉



  • Th69 schrieb:

    PS: Der Code kommt mir doch sehr bekannt vor 😉

    Also ich weiß gar nicht was du meinst 😉

    Hat tatsächlich geholfen. Danke dir!

    Überleg mal warum ich in das in C schreibe 🙂



  • In dem bisschen Code sind so viele Fehler, ich weiß gar nicht wo ich anfangen soll 😕

    Einige Fundamentale Dinge, die nicht direkt mit dem Problem zusamenhängen:

    • Das ist C++ und nicht C (falsches Unterforum).
    • In C++ strcat zu benutzen ist meistens nicht nötig.
    • Umlaute in Namen… Unterlass das lieber.
    char fct[]="";
    

    Das ist äquivalent zu:

    char fct[1]= {0};
    

    Wie man sieht hast du ein Array mit nur einem Feld. Das ist zuwenig Speicher für das was du vor hast (siehe unten).

    if (c != bracketFct.bra)
        const char *fct = GetString(c);
    

    Du erstellst in dem if Block eine neue Variable mit dem selben Namen, die sofort wieder vernichtet wird, wenn das if zu ende ist.

    strcat(fct, _fct);
    

    Wie oben gesagt ist fct nur ein Array mit einem Feld, d.h. du überschreibst irgendwelchen Speicher, wenn _fct eine Länge größer als 0 hat. Am einfachsten wäre:

    std::string fct; // Statt: char fct[]="";
    // Code …
    fct += _fct; // Statt: strcat(fct, _fct);
    


  • Alles was du auflistest wurde just in diesem Moment behoben, das war nur eine ausgeburt der Quick-and-Dirty Schreibeweiße.

    Trotzdem Danke.


Log in to reply