problem beim schreiben von pointern die an funktion übergeben wurden



  • Hi !
    Ich wollte mal gerade schnell ne funktion basteln die mir substrings entfernt...
    Dabei ist mir leider aufgeffalen das mir scheinbar wichtige Grundlagen was pointer angeht fehlen... Irgendwie dachte ich ich hätte das schon begriffen 🙂

    Hier mal der Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdarg.h>
    #include <sys/ioctl.h>
    #include <iostream>
    #include "time.h"
    
    #define BUFFERSIZE 256
    
    using namespace std;
    
    int instr(char *ioPtr, char *rplPtr)
    {
    	return((int)strstr(ioPtr,rplPtr)-(int)ioPtr);
    }
    
    int delstr(char *ioPtr, char *delPtr)
    {
    	int pos[4]={};
    	char buffer[BUFFERSIZE]={};
    
    	//cout<<"addys-delstr: "<<&ioPtr<<" "<<&delPtr<<endl;
    
     	//Anfang suchen..
    	pos[2]=0;
    	pos[0]=((int)strstr(ioPtr,delPtr)-(int)ioPtr);
    	//Ende suchen..
    	while(*delPtr++!=0)pos[1]++;
    	pos[1]+=pos[0];
    	//Alles vor Suchstring in dern buffer schreiben..	
    	while(pos[2]<pos[0])buffer[pos[2]++]=*ioPtr++;
    	//Suchstring ignorieren..
    	pos[3]=pos[2];
    	while(pos[3]++<pos[1])*ioPtr++;
    	//Alles nach Suchstring in dern buffer schreiben..
    	while(*ioPtr!=0)buffer[pos[2]++]=*ioPtr++;
    	//buffer übergeben:
    	ioPtr=ioAddy;
    	for(int i=0;i<BUFFERSIZE;i++)*ioPtr++=buffer[i];
    	cout<<"Buffer: "<<buffer<<endl;
    
    	_delay_ms(1000);
    	return pos[0];
    }
    
    int main(int argc, char* argv[])
    {
    	int err=0;
    
    	char *t1=(char*)"test string string string input";
    	char *t2=(char*)"string ";
    
    	while(1)
    	{
    		cout<<"Buffer: "<<delstr(t1,t2)<<" "<<t1<<endl;
    		_delay_ms(5);
    	}
    	return 0;
    }
    

    Warum funktioniert das nicht ???:

    for(int i=0;i<BUFFERSIZE;i++)*ioPtr++=buffer[i];
    

    nicht ? und wie sollte man sowas händeln ?

    Mfg Benny



  • wie sollte man sowas händeln?

    Ohne jetzt auf deinen Code einzugehen (da er eh nichtmal fehlerfrei kompiliert), ungefähr so:

    char* rmstr(char* string, const char* to_remove){
        char* ptr = 0;
    
        while((ptr = strstr(string, to_remove)) != 0){
            for( ; *ptr != 0; ++ptr)
                *ptr = *(ptr + strlen(to_remove));
        }
    
        return string;
    }
    


  • Hallo Benny,
    du bist im falschen Forum gelandet, du machst C nicht C++. 😉



  • out schrieb:

    Hallo Benny,
    du bist im falschen Forum gelandet, du machst C nicht C++. 😉

    Ich hab mich auch grad gewundert, warum ich diesen Thread hier nicht mehr im C-Subforum finden konnte 😃



  • out schrieb:

    Hallo Benny,
    du bist im falschen Forum gelandet, du machst C nicht C++. 😉

    Jein. Der macht C + std::cout.



  • Was zum ...
    Dein Code ist lupenreines C bis auf den <iostream> -Header und das ge cout e. Soll das ein schlechter Scherz sein?

    Du machst so ziemlich alles falsch. Nicht nur, dass du UB erzeugst indem du String-Literale im Speicher überschreibst, du versuchst Element für Element einem 256 Zeichen langen String einem 33 langen zuzuweisen.
    Deswegen funktioniert deine Zeile vermutlich nicht.

    Das sieht mir stark nach einem Troll aus.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C (C89, C99 und C11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Sone schrieb:

    Das sieht mir stark nach einem Troll aus.

    Ich denke, hier ist Hanlon's razor angebracht.



  • SeppJ schrieb:

    Sone schrieb:

    Das sieht mir stark nach einem Troll aus.

    Ich denke, hier ist Hanlon's razor angebracht.

    ignorantia legis neminem excusat



  • Sone schrieb:

    Was zum ...
    Dein Code ist lupenreines C bis auf den <iostream> -Header und das ge cout e. Soll das ein schlechter Scherz sein?

    Du machst so ziemlich alles falsch. Nicht nur, dass du UB erzeugst indem du String-Literale im Speicher überschreibst, du versuchst Element für Element einem 256 Zeichen langen String einem 33 langen zuzuweisen.
    Deswegen funktioniert deine Zeile vermutlich nicht.

    Das sieht mir stark nach einem Troll aus.

    ??? also ich mache so ziemlich alles falsch... nehm ich mal so hin....
    Soll das ein schlechter Scherz sein? <- was genau ist hier gemeint?
    UB=überlauf ? (mist... ich sehe es ein)
    das sieht mir stark nach einem troll aus ? <- wtf? also wie jetzt troll ?

    mfg benny



  • Soll das ein schlechter Scherz sein? <- was genau ist hier gemeint?

    Ob das ganze ein schlechter Scherz ist, oder nicht. (Leider nicht 😞 )

    UB=überlauf ? (mist... ich sehe es ein)

    Nein, nein, UB ist eine englische Abkürzung für undefined behavior, was im Deutschen undefiniertes Verhalten heißt.

    das sieht mir stark nach einem troll aus ? <- wtf? also wie jetzt troll ?

    Ach, vergiss es.
    (Bist nicht genug im Internet unterwegs, nicht wahr?)



  • McMorf schrieb:

    Soll das ein schlechter Scherz sein? <- was genau ist hier gemeint?

    Das dein Code von vollkommener Inkompetenz zeugt, was die Unterscheidung zwischen C und C++ angeht.
    Wenn dich jemand fragt, was du programmierst, wirst du vermutlich C++ antworten (weils auch nur unter C++ kompiliert).
    Dann ist das grottiger Stil, denn so programmiert man in C. In C++ macht man so etwas nicht.
    Wenn du C++ lernen willst, besorge dir ein vernünftiges Buch.
    Wenn du C lernen willst, vergiss cout und besorge dir ein vernünftiges Buch.



  • sehr hilfreiche beiträge... muss ich schon sagen....
    ich frage um hilfe und ihr(so leute wie Nathan) sagt mir nur dass ich doof/inkompetent oder was weis ich nicht bin...
    naja wie soll ich sagen ?!? wenn ich mich für so schlau halten würde, würde ich ja nicht in foren nach hilfe fragen 😛

    Mfg Benny



  • Das ist nicht böse gemeint, sondern eher erschrocken.



  • McMorf schrieb:

    sehr hilfreiche beiträge... muss ich schon sagen....
    ich frage um hilfe und ihr(so leute wie Nathan) sagt mir nur dass ich doof/inkompetent oder was weis ich nicht bin...
    naja wie soll ich sagen ?!? wenn ich mich für so schlau halten würde, würde ich ja nicht in foren nach hilfe fragen 😛

    Mfg Benny

    Hallo Benny,

    nimm es nicht so schwer. Das Lernen einer Programmiersprache gestaltet sich anfangs als schwierig. Gerade wenn es sich um C bzw. C++ handelt.

    Entscheide dich, ob du C oder C++ programmieren willst, und nimm dir dann die Suchfunktion und such nach Buchempfehlungen. Es gibt zwar im Internet auch viele Infos, aber oft ist es einfach fehlerhaft und die Leute lernen müll...

    UB heißt Undefined Behaviour und bedeutet Undefiniertes Verhalten. Dein Programm könnte möglicherweise also das machen, was du willst, aber es könnte auch etwas absurdes machen - das Verhalten ist eben undefiniert und damit nicht mehr vorhersehbar. Das ist das schlimmste, was einem passieren kann.



  • was ist jetzt so erschreckend ? das ich c und c++ vermische ?
    oder das ich im falschen sub-forum gepostet hab ?

    erzähl mir bitte was dich so erschreckt, dann kann ich drann arbeiten...
    ich will ja lernen, nur dafür brauch ich auch manchmal die passende hilfe 🙂

    mfg benny



  • Schau dir schon mal folgendes an:

    char *t1=(char*)"test string string string input";
    char *t2=(char*)"string ";
    

    Du erzeugst damit konstante String-Literale. Und dann versuchst du später darauf zu operieren und Zeichen zu entfernen, etc. Das ist nicht möglich und erzeugt wenn du Glück hast einen Crash oder es ergibt sich das besagte UB.



  • Das ist nicht möglich und erzeugt wenn du Glück hast einen Crash oder es ergibt sich das besagte UB.

    Nun es ist vom Sprachstandard nicht definiert. Das bedeutet aber noch lange nicht, dass es durch den Kompiler nicht erlaubt wird.

    Das ist nicht möglich und erzeugt

    Und ob das moeglich ist, nur wird es durch den Standard nicht definiert.



  • [/code]
    char *t1=(char*)"test string string string input";
    char *t2=(char*)"string ";
    [code="c"]

    Du erzeugst damit konstante String-Literale. Und dann versuchst du später darauf zu operieren und Zeichen zu entfernen, etc. Das ist nicht möglich und erzeugt wenn du Glück hast einen Crash oder es ergibt sich das besagte UB.

    ok das habe ich verstanden, das war mal nen hilfreicher tipp... ziemlich blöd von mir 🙂


  • Mod

    Leute, regt euch mal wieder ab. Was ist denn auf einmal los hier? Ist doch nicht das erste Mal, dass wir hier eine schlechte Mischung aus C und C++ sehen.

    @McMorf: Ich habe dich mal in das C-Forum verschoben, da ich annehme, dass du eigentlich C machen möchtest und die Unterscheidung der beiden Sprachen nicht so recht drauf hast. Es sieht jedenfalls wie C aus, bis auf die Ausgaben und ein paar andere Kleinigkeiten. Falls ich mich irre und du C++ machen möchtest, dann kann ich dich auch wieder nach C++ schieben, aber du darfst damit rechnen, dass du bei einer richtigen C++-Antwort nur Bahnhof verstehen wirst. Eine C-Antwort wird wahrscheinlich ähnlich verwirrend sein, da du so ziemlich alles falsch machst, was man falsch machen kann, aber es ist vielleicht wenigstens etwas, das dir hilft, C zu lernen.

    Derzeit ist dein Code aber nicht einmal compilierbar und deine Fehlerbeschreibung ist nur "funktioniert nicht", daher ist die Hilfsbereitschaft eher gering. Dein Code enthält mehrere Dutzend schwerer Fehler, auf welchen bezieht sich "funktioniert nicht"? Alle? Da würde man ja ewig an einer Antwort schreiben müssen, daher kommen nur so Antworten wie:

    Nathan schrieb:

    Wenn du C++ lernen willst, besorge dir ein vernünftiges Buch.
    Wenn du C lernen willst, vergiss cout und besorge dir ein vernünftiges Buch.

    Dem schließe ich mich mal vorerst an. Du hast so viele Fehler drin, da sitzen nicht einmal die Grundlagen. Die können wir hier nicht jedem erklären. Hier im Forum findest du Buchtipps. Finger weg von Internettutorials und Allem, was schnellen, vollständigen oder einfachen Erfolg verspricht ("in 21 Tagen", "von A bis Z", "für Dummies"). Taugt erfahrungsgemäß nichts.


Anmelden zum Antworten