Removing spaces in char arrays



  • Hi,

    ich versuche gerade aus mehreren char arrays leerzeichen zu entfernen.
    Ich verzweifle hier gerade an der wolhbekannten Pointerarithmetik.

    Ich habe zwei funktionen überladen. Die eine löscht erfolgreich leerzeichen.
    Die zweite soll ein zweidimensionales char array annehmen können, welches natürlich aus allen arrays die leerzeichen löscht.

    Die letztere Funktion will nich so ganz. Also es wird erfolgreich kompiliert und es wird auch an die erste Funktion ein array übergeben. Allerdings
    tritt bei dieser konstellation dann ein memory violation fehler auf.

    Vielen Dank

    int main(void){
    char *input2[]={"hal lo","bert a","  hugo"};
    removeSpaces(input2);
    cout << "\n\n whitespaces removed:" << input;
    }
    
    void removeSpaces(char* cArray[]){
    
    	int i=0;
    	while(*(cArray+(i))){
    		cout << (cArray+i) << ": " << *(cArray+i) << endl;
    
    		removeSpaces(cArray[i]);
    		i++;
    	}
    }
    
    void removeSpaces(char* c){
    	cout << "&c: " << &c << endl;
    	cout << "c: " << c;
    
    	char *s=c;
        while(*(c++))
        {
    		while(*(s++)){
    			if(*s!=' ')
    				break;
    		}
    		*c=*s;
        }
    }
    


  • #include <iostream>
    using namespace std;
    
    void removeSpaces (char* c)
    {
       char *p;
       for (p=c; *c; c++)
          if (*c != ' ')
             *p++ = *c;
       *p = 0;
    }
    
    void removeSpaces (char *cArray[])
    {
       while (*cArray)
          removeSpaces (*(cArray++));
    }
    
    int main(void)
    {
       char a[] = "hal lo";
       char b[] = "bert a";
       char c[] = "  hugo";
       char *input2[] = {a, b, c, 0}; 
    
       removeSpaces (input2);
    
       for (int i=0; input2[i] ;i++)
          cout << input2[i] << endl;
    }
    


  • std::vector<char> vec(cArray, std::strlen(cArray));
    
    std::vector<char>::iterator it = std::remove(vec.begin(), vec.end(), ' ');
    
    vec.resize( it - vec.begin() );
    

  • Mod

    Das geht auch ohne Container

    void removeSpaces (char* c)
    {
        std::remove( c, c + strlen( c ) + 1, ' ' );
    }
    


  • danke fan!

    ich hätte vielleicht dazuschreiben sollen, dass ich keinen workaround haben möchte.

    Kann mir jemand erklären warum mein code nicht funktioniert ?



  • while(*(c++)) 
    //...
        *c=*s;
    

    Du testest erst, ob c gültig ist, dann inkrementierst du das und arbeitest dann mit dem inkrementieren wert weiter, der ungültig sein kann


Anmelden zum Antworten