Funktion um Zeichen in chars zu entfernen



  • Hallo,

    Ich proggramiere gerade eine Funktion um Zeichen in CStrings zu entfernen. Das Prob ist das ich immer eine Zugriffsschutzverletzung bekomme. Hat jemmand ne Idee woran das liegt

    void cstringZeichenEntfernen(char* string, char* entf_zeichen)
    {
    	int i = 0;
    	char temp[255];
    	char* temp2;
    
    	while(1)
    	{
    		temp2 = string+i;
    		if(*temp2 == "\0")
    		{
    			temp[i] = *string+i;
    			break;
    		}
    		if(*string+i == *entf_zeichen)
    		{
    			continue;
    		}
    		temp[i] = *string+i;
    		i++;
    	}
    	strcpy(string, temp);
    	return;
    }
    


  • void cstringZeichenEntfernen(char* string, char* entf_zeichen) 
    { 
        int i = 0,j=0; 
        char temp[255]; 
        char* temp2; 
    
        while(1) 
        { 
            temp2 = string+i; 
            if((*temp2) == '\0') 
            { 
                temp[j] = *string+i; 
                break; 
            } 
            if(*(string+i) == *entf_zeichen) 
            { 
    	        i++;
                continue; 
            } 
            temp[j] = *string+i;
            j++;
            i++; 
        } 
        strcpy(string, temp); 
        return; 
    }
    


  • hm, sollte

    if(*string+i == *entf_zeichen)
    

    nicht

    if(*(string+i) == *entf_zeichen)
    

    sein?

    dann: da "temp2" ja eh schon string+i; ist könntest du doch durchgehend temp2 verwenden und nicht nur für die erste if.
    ist zwar nur kosmetisch aber wenn schon, dann... ^^



  • so danke soweit ich habe jetzt alles duch temp ersetzt (war eigentlich nur zu debugingzwecken da). Jetzt habe ich allerdings das Problem das wenn ich als Zeichfolge test test eingebe, dann bekomme ich als zeichenfolge testxe oder ähnlich zurück es sollte aber testtest kommen. Könnte jemmand den Kram noch mal testen.

    void cstringZeichenEntfernen(char* string, char* entf_zeichen)
    {
    	int i = 0;
    	char temp[255];
    	char* temp2;
    
    	while(1)
    	{
    		temp2 = string+i;
    		if((*temp2) == '\0')
    		{
    			temp[i] = (*string+i);
    			break;
    		}
    		if((*temp2) == (*entf_zeichen))
    		{
    			continue;
    		}
    		temp[i] = (*temp2);
    		i++;
    	}
    	strcpy(string, temp);
    	return;
    }
    


  • guck dir mal meinen code an...



  • kannst du das Codesnipet mal hier posten ich kann dir sonst nicht folgen ...



  • profis verwenden auch
    foo[i]
    statt
    *(foo+i)
    und wenn man ganz cool ist
    nimmt man
    i[foo]

    btw: warum ist entf_zeichen ein zeiger?



  • ach, ich bin nicht so:

    ist aber C code, in c++ würde man es anders machen

    char* stripchar(char* str, char c)
    {
      char* p=str;
      size_t len=strlen(p);
    
      while(p=strchr(p, c))
        memmove(p, p+1, len-(p-str));
    
      return str;
    }
    

    wobei man das natürlich noch optimieren kann, ist ziemlich lahm momentan
    dafür schön klein 🙂



  • Hat das einen bestimmten Grund warum, du einen Zeiger zurückgibts??? Den den Zeiger hat man aufjeden Fall schon (man übergibt str ja als Parameter). Das Zeichen nachdem gesucht wir ist desshalb ein Zeiger, da man sonst nicht schreiben kann stripchar(xy, " ");

    Und nochmal wegen den Eckklammern, ich meine das mal ausprobiert zu haben und mein Kompiler hats nicht geschluckt.



  • flammenvogel schrieb:

    kannst du das Codesnipet mal hier posten ich kann dir sonst nicht folgen ...

    tipp: noch oben scrollen



  • flammenvogel schrieb:

    Hat das einen bestimmten Grund warum, du einen Zeiger zurückgibts???

    Ja, es ist oft einfacher zu verwenden:

    printf("string = ", stripchar(str, 'e'));
    

    natürlich nicht nötig, aber hin und wieder praktisch.

    Und nochmal wegen den Eckklammern, ich meine das mal ausprobiert zu haben und mein Kompiler hats nicht geschluckt.

    a[b] == *(a+b) == *(b+a) == b[a]

    diese 4 codes sind identisch
    wenn es der compiler nicht schluckt, liegts an was anderem



  • ups, sorry life nicht gesehen


Anmelden zum Antworten