problem beim schreiben von pointern die an funktion übergeben wurden



  • hmm... ok... das war mir so nicht bewusst, werde in zukunft casts vermeiden...
    SOLCHE AUSSAGEN ! sind hilfreich !
    Danke dafür !

    Mfg Benny



  • das ist ja auch mal was... unbeliebte aussagen werden hier zensiert ?!?

    naja wie dem auch sei...
    ich weiß man kann die pointer auch weck lassen und direkt mit den adressen arbeiten, dann wirds meiner meinung nach aber unübersichtlich...

    so...
    was ist denn jetzt hier drann noch schlechter stil ?!?
    ich will ja an meinem stil arbeiten, soll ja auch mal vernünftig lesbar sein...
    irgendetwas findet ihr doch bestimmt noch...

    achso bitte nur konstruktieves, auf trolle die mir troll sein vorwerfen hab ich nähmlich keine lust und ich kann mir auch nicht vorstellen das das im sinne dieser community ist *grmbl*

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define BUFFERSIZE 256
    
    int delstr(char *buffer, char *substr)
    {
    	char *sptr;
    	char *eptr;
    	char *cptr;
    	char *bptr;
    
    	while(strstr(buffer,substr)!=0)
    	{
    		sptr=strstr(buffer,substr);
    		eptr=(strstr(buffer,substr)+strlen(substr));
    		cptr=&buffer[strlen(substr)];
    		bptr=eptr;
    
    		while(*eptr++!=0)*sptr++=*bptr++;
    		bptr=&buffer[(strlen(buffer)-strlen(substr))];
    		while(*bptr!=0)*bptr++=0;
    	}
    	return 0;
    }
    
    int main(int argc, char* argv[])
    {
    	char buffer[BUFFERSIZE]={};
    	strcpy(buffer,"test string test string ausgabe");
    
    	while(1)
    	{
    		delstr(buffer,(char*)"string ");
    		printf("Buffer: %s\n",buffer);
    		//_delay_ms(5);
    	}
    	return 0;
    }
    

    etwas noch... in zukunft werde ich c und c++ nicht mehr vermischen, hab verstanden das das keiner mag !
    das UB was ich erzeugt habe lag nur beim const char * t1 ?!? oder erzeuge ich soetwas auch durch casten ?!? also wenn cih weis warum ich caste brauch der compiler es doch nicht zu wissen oder ?
    muss ich eigendlich die pointer initialisieren ?!?
    werden ja nicht genutzt es sei denn ein substring ist im buffer vorhanden (da bekommen sie ja eh ihre addressen)
    fragen über fragen...
    erst mal danke für die herzliche mithilfe, an die persohnen die konstruktiev geholfen haben...

    mfg benny



  • mist, ich caste ja immer noch , tüdeldü 🙂 den ersetze ich auch schnell noch....



  • vlt ersetze ich printf noch durch sprintf, aber bitte jetzt nicht wegen solchen sachen meckern, über bufferoverflows ham wir ja schon geredet 😛


  • Mod

    mcmorf! schrieb:

    das ist ja auch mal was... unbeliebte aussagen werden hier zensiert ?!?

    Ja. Nicht nur das: Du und dein ganzer Thread schlingern gerade zielsicher auf eine vollständige Sperrung zu. Lass dir das eine Warnung sein. Benimm dich wie ein normaler Mensch!



  • SeppJ schrieb:

    mcmorf! schrieb:

    das ist ja auch mal was... unbeliebte aussagen werden hier zensiert ?!?

    Ja. Nicht nur das: Du und dein ganzer Thread schlingern gerade zielsicher auf eine vollständige Sperrung zu. Lass dir das eine Warnung sein. Benimm dich wie ein normaler Mensch!

    ??? was habe ich denn jetzt schon wieder gemacht ?



  • so, nun mach das doch mal vernuenftig!

    char* remove_substring ( char* string, const char* substring );
    

    maximal eine schleife, maximal ein if und maximal ummmm ... sagen wir mal zwei funktionsaufrufe aus der standard lib.



  • const char*delstr(char *q,const char *s)
    {
      char *p;
      while(p=strstr(q,s))
        memmove(p,p+strlen(s),strlen(p+strlen(s)-1));
      return q;
    }
    
    int main()
    {
      char s[]="blaxblafasel";
      puts(delstr(s,"bla"));
      return 0;
    }
    

  • Mod

    mcmorf! schrieb:

    char buffer[BUFFERSIZE]={};
    

    Leere Initialisierer sind in C nicht zulässig. Da Strukturen dort nie leer sein können und alle primitiven Typen durch 0 intitialisiserbar sind, kann man im Zweifel (dank barce-elision) immer eine 0 schreiben

    char buffer[BUFFERSIZE]={0};
    


  • Wutz schrieb:

    const char*delstr(char *q,const char *s)
    {
      char *p;
      while(p=strstr(q,s))
        memmove(p,p+strlen(s),strlen(p+strlen(s)-1));
      return q;
    }
    
    int main()
    {
      char s[]="blaxblafasel";
      puts(delstr(s,"bla"));
      return 0;
    }
    

    tststs
    das teure memmove muss doch nun wirklich nicht sein.

    camper schrieb:

    dank barce-elision

    bitte was?



  • camper schrieb:

    mcmorf! schrieb:

    char buffer[BUFFERSIZE]={};
    

    Leere Initialisierer(listen) bedeuten einen Syntaxfehler, worauf ein standardkonformer Compiler ebenso wie bei einer constraint violation irgendwie reagieren muss, z.B. mit einem Hinweis/Warnung/Fehler.


  • Mod

    mcmorf benutzt anscheinend immer noch einen C++-Compiler für sein C.



  • Er meinte brace elision. Hat sich verschrieben.

    Edit: Wutz, wenn es ein Fehler ist, dann kann das doch nicht in einer Warnung resultieren?



  • [quote="big bam bubie"]

    Wutz schrieb:

    const char*delstr(char *q,const char *s)
    {
      char *p;
      while(p=strstr(q,s))
        memmove(p,p+strlen(s),strlen(p+strlen(s)-1));
      return q;
    }
    
    int main()
    {
      char s[]="blaxblafasel";
      puts(delstr(s,"bla"));
      return 0;
    }
    

    tststs
    das teure memmove muss doch nun wirklich nicht sein.

    kann das denn mal ein profi richtig machen?
    bitteeee



  • Sone schrieb:

    Er meinte brace elision. Hat sich verschrieben.

    Edit: Wutz, wenn es ein Fehler ist, dann kann das doch nicht in einer Warnung resultieren?

    Der C Standard kennt keine (Unterscheidung zw.) Hinweis/Warnung/Fehler.
    Er sagt nur, dass der Compiler irgendwie irgendwas melden muss.
    Es ist also quasi implementierungsabhängig, nicht dass, sondern wie der Compilerhersteller seinen Compiler in diesem Fall reagieren lässt.



  • ui...
    Danke !!!
    memmove kannte ich noch nicht, werd mich gleich mal mit der referenz auseinander setzen...

    buffer[Buffersize]={};
    

    Ich dachte der Buffer wird dann mit nullen gefüllt, werde dann mal ={0}; austesten.

    ja, mist ich hab im makefile immer noch g++ stehen, werde ich dann auch schnell mal ändern !

    Super Herzlichen Dank !
    Ich werde mich dann gleich mal einarbeiten !



  • Wutz schrieb:

    const char*delstr(char *q,const char *s)
    {
      char *p;
      while(p=strstr(q,s))
        memmove(p,p+strlen(s),strlen(p+strlen(s)-1));
      return q;
    }
    
    int main()
    {
      char s[]="blaxblafasel";
      puts(delstr(s,"bla"));
      return 0;
    }
    

    Mehr strlen Aufrufe gingen nicht? 😃

    void rmvnchr ( char* pos, size_t n )
    {
    	char* a = pos, *b = pos + n;
    	while ( *b )
    		*a++ = *b++;
    	*a = 0; 
    }
    
    int main(void)
    {
    	char string[] = "blaxblafasel";
        char* pos = string; 
    	char* substring = "bla";
    	size_t len = strlen ( substring );
    
    	while ( NULL != ( pos = strstr ( pos, substring )))
    		rmvnchr ( pos, len );
    	puts ( string );
    	return 0;
    }
    

Anmelden zum Antworten