Leerzeichen aus einem charArray entfernen...



  • Irgendwie bekomme ich es einfach nicht hin, kann mir jemand vielleicht helfen oder einen einfacheren weg nennen um dies zu bewerkstelligen.
    ( benutze Microsoft Visual C++ )

    Ich habe eine Variable "str" ( char str[80] ) in diese lese ich per "gets()" eine Zeile ein.
    Nun will ich die Leerzeichen aus dieser Variable verbannen.
    Also wenn "Hallo ich bin Udo" eingegeben wird, möchte ich dann "HalloichbinUdo" erhalten.

    Hier meine bisherige Funktion:

    trimSpace( char *a ){
    	char s[80];
    	int l = strlen( a ), i = 0, j=0;
    	while( l-- )
    	{
    		if( !isspace( a[i] ) )
    		{
    			s[j++] = a[i];
    		}
    		i++;
    	}
    	s[j] = '\0';
    }
    
    // Aufruf irgendwo im Prog
    trimSpace( str );
    

    Funktioniert zumindest soweit das es die Leerzeichen entfernt werden, aber ich weis echt nicht wie ich den Wert am besten zurückgeben kann.
    Habe schon einiges versucht aber es will nicht.
    Geht es vielleicht auch etwas einfacher??

    rendner



  • Versuchs mal damit, läuft schon einige Zeit stabil

    /***********************************************************************.FA*
     .FUNCTION [ nstrip                                                     ]
    --------------------------------------------------------------------------
     .GROUP    [ String                         ]
     .AUTHOR   [ PAD /DDT                ]
    --------------------------------------------------------------------------
     .DESCRIPTION
      Diese Routine entfernt den angegebenen Buchstaben aus dem Eingabestring s
      !!!! Achtung der Eingabestring wird verändert
    --------------------------------------------------------------------------
     .INDEX
       Utilities
    --------------------------------------------------------------------------
     .PARAMETER
        IN/OUT  char * s         Inputstring
                char  type       character to be removed
    --------------------------------------------------------------------------
     .RETURNVALUE
       none
    --------------------------------------------------------------------------
     .VARIABLE_REFERENCES
    --------------------------------------------------------------------------
     .HISTORY
      Date      Author          Comment
      09.05.94  PAD /DDT    Definition  (Ver 1.93 -> 1.94)
    **********************************************************************.HE**/
    void  _ETZ_FUNCS nstrip( char * s, char type )
    {
      char *t;
      t=s;
      while ( * s != '\0' )
      {
        if ( * s != type )  * t++= * s++;
        else    s++;
      }
      * t = '\0';
    }
    
    #ifdef TESTMAIN
    main()
    {
      char *a="\"test\" \"  ssldfjdslfjlkjgkj";
      char *b="\"Hallo Welt\"";
      nstrip(a,'"');
      nstrip(b,' ');
      nstrip(b,'"');
      return 0;
    }
    
    #endif
    


  • 😃 Super.
    Das ist es, da hätte ich bestimmt noch ne weile Probieren müssen bis ich darauf gekommen währ.

    Danke.



  • oder mit umgekehrter logik 😉

    void spacekiller (char *s)
    {
        char *p;
        for (p = s; *s; *p = *s)
            if (*s++ != ' ')
                p++;        
        *p = 0;
    }
    


  • welche ist schneller???



  • PAD schrieb:

    welche ist schneller???

    keine ahnung. jedenfalls kann deine stringkonstanten verändern (siehe testmain). das kann meine nicht 😉



  • Ich steh aufm Schlauch, kannst du das bitte etwas genauer erklären



  • PAD schrieb:

    main()
    {
    char *a="\"test\" \" ssldfjdslfjlkjgkj";
    char *b="\"Hallo Welt\"";
    nstrip(a,'"');
    nstrip(b,' ');
    nstrip(b,'"');
    return 0;
    }

    char *a = "irgendwas";
    das "irgendwas" ist im normalfall read-only.



  • Und was verhindert das bei deiner Methode?



  • Man kann gar nicht verhindert dass dies passiert. Genau darum definiert man auch immer einen String-Literal als const char*.

    const char* text = " : -  )  ";
    nstrip(text, ' ');  // blub: cannot convert const char* to char*
    

    Btw würd ich es so machen *auch-noch-Senf-dazu-geb*

    // src und trg kann auch gleich sein, macht nix
    void chrdel(char const *src, char *trg, char remove)
    {
        while(*(src++))    
    		if(*src != remove)
    			*(trg++) = *src;
    	*trg = '\0';
    }
    


  • Das hat aber die Schwäche, dass Du mit while(*src++) startest, und danach *src benutzt:

    • Ein führendes Zeichen wird immer gekillt
    • Bei 1-Zeichen-Strings enthält trg zwei \0 hintereinander

    So könnt's gehen:

    // src und trg kann auch gleich sein, macht nix
    void chrdel(char const *src, char *trg, char remove)
    {
        while(*src)
        {    
            if(*src != remove) *trg++ = *src;
            src++;
        }
        *trg = '\0';
    }
    


  • Stimmt ich habs net getestet. *narf-narf*



  • da habt ihr noch einen 😃

    void removespaces (char *s)
    {
        int i = 0;
        while (*s++)
        {
          while (s[i] == ' ')
             i++;
          *s = s[i];
        }     
    }
    


  • /***********************************************************************.FA* 
     .FUNCTION [ nstrip                                                     ] 
    -------------------------------------------------------------------------- 
     .GROUP    [ String                         ] 
     .AUTHOR   [ PAD /DDT                ] 
    -------------------------------------------------------------------------- 
     .DESCRIPTION 
      Diese Routine entfernt den angegebenen Buchstaben aus dem Eingabestring s 
      !!!! Achtung der Eingabestring wird verändert 
    -------------------------------------------------------------------------- 
     .INDEX 
       Utilities 
    -------------------------------------------------------------------------- 
     .PARAMETER 
        IN/OUT  char * s         Inputstring 
                char  type       character to be removed 
    -------------------------------------------------------------------------- 
     .RETURNVALUE 
       none 
    -------------------------------------------------------------------------- 
     .VARIABLE_REFERENCES 
    -------------------------------------------------------------------------- 
     .HISTORY 
      Date      Author          Comment 
      09.05.94  PAD /DDT    Definition  (Ver 1.93 -> 1.94) 
    **********************************************************************.HE**/
    

    Da sagt noch einer es kann nicht zuviel kommentiert werden. 😮 🙄
    Meiner Meinung nach ist so Kommentieren totaler Schwachsinn.



  • Der Überhammer ist aber dass er für das bischen Code jetzt schon bei Version 1.94 angelangt ist. 😃



  • So ein Versuch witzig zu sein

    Einer: "Hei Alter zeig mal was du bisher so in C++ gemacht hast."
    Ich drücke Taste F5
    In der Console erscheint: "Hello World".
    Er: "Na Spitze nur so ne Hello World Ausgabe. Wieviele Zeilen hast du denn dafür geschrieben?!?"
    Ich: "1000".
    Er: "Echt? Wau C scheint ja echt schwer zu sein!!! Respekt"

    Den Quellcode habe ich ihm nicht gezeigt 😉

    /***********************************************************************.FA* 
     .Programm [ Hello World                                                     ] 
    -------------------------------------------------------------------------- 
     .GROUP    [ App                         ] 
     .AUTHOR   [ Dali                ] 
    -------------------------------------------------------------------------- 
     .DESCRIPTION 
      Dies ist mein erstes Hello World Programm geschrieben in 100 Stunden 
      Habe viel dabei gelernt. 
      Meine Mutter war ganz stolz auf mich. Hat mir sogar ein Eis geschenkt.
    -------------------------------------------------------------------------- 
     .INDEX 
       Apps
    -------------------------------------------------------------------------- 
     .PARAMETER 
        IN/OUT  int argc
                char**  type verwende ich jetzt nicht
    -------------------------------------------------------------------------- 
     .RETURNVALUE 
       int 
    -------------------------------------------------------------------------- 
     .VARIABLE_REFERENCES 
    -------------------------------------------------------------------------- 
     .HISTORY 
      Date      Author          Comment 
      20.06.05  Dali	         versuche mein erstes Hello world scheitere an
                                komischen Meldungen
      21.06.05  Dali            Ich kriegs einfach nicht hin irgendwie will er
                                nicht.
      22.06.05  Dali            Es funktioniert v1.0
      23.06.05  Dali            So habe gehört man muss immer etwas in main 
                                zurückgeben v1.1
      24.06.05  Dali            Mache heute nicht weiter bin noch ganz betrunken von gestern.
      25.06.05  Dali            Habe gehört es muss heißen #include <iostream>
                                nicht mit .h frag mich nicht warum die meinen
                                dass das veraltet sei... auch hab ich jetzt
                                using namespace std dazugefügt v1.2
      26.06.05  Dali            So habe mal ein Tutorial im Internet gefunden
                                das so komische Parameter verwendet. Sieht gut
                                aus ich verwende das ab jetzt auch. v1.3
      27.06.06  Dali            Habe einen Punkt nach Hello World dazugefügt. v1.4
      28.06.06  Dali            Anscheinend soll da ein Enter am Schluss sein v1.5
      29.06.06  Dali            Kam nicht dazu das Programm zu verbessern. Meine
                                Lehrerin nerft mich so...
      30.06.06  Dali            So ich habe jetzt aus dem Punkt ein Rufezeichen gemacht.
                                v1.6  
    **********************************************************************.HE**/
    
    #include <iostream>
    using namespace std;
    int main (int argc, char** argv) {
    cout << "Hello world.";
    return 0;
    }
    


  • Sorry, das ist der bei uns übliche Standardheader, der für alle Funktionen genutzt wird. Die Header werden in dieser Form automatisch erzeugt und extrahiert und dienen dann zur Erzeugung der Dokumantion und des Kundenhanbuchs sowohl
    im HTML als auch als im PDF Format (das PDF wird über TeX erzeugt).
    d.h Die komplette Dokumentation befindet sich beim Source Code und wird dort gepflegt, und ist somit viel einfacher auf Stand zu halten als in einer getrennten Dokumentation.

    @Dali
    Die Versionsnummer bezieht sich auf die eine Tool-Library die ca 200 Routinen enthält. Die Aussage ist nicht, das für diese Routine die 94 Versionen gebraucht wurden sondern das diese Funktion hinzugekommen ist und in der Library ab Version 1.94 zur Verfügung steht. Sollte noch jemand ältere Versionen der Library nutzen, erfährt er somit in der Dokumentation erfahren das er diese Funktion nicht aus der Library nutzen kann.

    @Dali was dir nicht aufgefallen ist, das im Historyrecord 😃 genau eine Zeile 😃 steht

    09.05.94 PAD /DDT Definition (Ver 1.93 -> 1.94)

    Datum 09.05.1994 Definition danach keine weiteren Einträge.

    Zu deiner Informtion RCS/CVS System schreiben neuere Versionen typischerweise oberhalb des alten Records.
    Dein Beispiel hätte also lauten müssen

    /*
      30.06.06  Dali            So ich habe jetzt aus dem Punkt ein Rufezeichen gemacht.
                                v1.6  
    ....
      20.06.05  Dali            versuche mein erstes Hello world scheitere an
                                komischen Meldungen
    */
    

    MfG

    :p Übrigens starke Leistung diesen kurzen Header mit 3 Beiträgen zu kommentieren die in Summe deutlich länger sind :p


Anmelden zum Antworten