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