problem beim schreiben von pointern die an funktion übergeben wurden



  • 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