Problem mit Strings
-
Thema aber sowas von total verfehlt.
1. new ist C++, wir sind hier in C.
2. Du kannst s nicht einfach so deleten. Wer sagt dir, dass der Speicher hinter s mit new geholt wurde?
3. Hast du selbst die Funktion mal ausprobiert? Sicher nicht. Die Funktion ist ein einziges Speicherloch. Du kannst ja mal überlegen welchen Wert s nach der Funktion wieder hat und musst feststellen, dass auch Zeiger "by value" übergeben werden.
-
http://c-plusplus.net/forum/viewtopic-var-t-is-194870.html
http://c-plusplus.net/forum/viewtopic-var-p-is-1383135.html
-
LordJaxom schrieb:
http://c-plusplus.net/forum/viewtopic-var-t-is-194870.html
http://c-plusplus.net/forum/viewtopic-var-p-is-1383135.htmlJa, und die Liste ist noch länger. Da die Frage hier aber thematisch richtig ist, werde ich das nicht zumachen.
-
Du musst nur das richtige Zeichen auf 0 setzen. Dann geht der string nur bis zur 0.
-
Tim schrieb:
Thema aber sowas von total verfehlt.
BorisDieKlinge ist der dümmste Programmierer aller Zeiten!
-
void removeEnd(char *s,int n) { s[n]=0; }
-
Lord Of The Strings schrieb:
void removeEnd(char *s,int n) { s[n]=0; }
was soll das bringen? wenn der String 20 Zeichen lang ist, und es sollen 5 Zeichen abgeschnitten werden, du aber einfach sagst, bei 5 ist schluß. dann hat er statt 15 zeichen nur noch 5 zeichen.
-
#define removeEnd(s,n) ((s)[strlen(s)-(n)]=0)
besser?
-
ja, besser
Edit: Ich würde anstatt gleich 0 aber gleich '\0' benutzen
-
Wenn du bei einem allokierten sting abkürzt, in dem du einfach an einer bestimmten position ein 0 Zeichen setzt hast allokierten Datenmüll! Der Ansatz von Boris ist schon die richtigere Richtung!
-
void removeEnd(char *s,int n) { s= realloc(s,strlen(s)-n); }
EDIT: Hab in C schon ewig nichts mehr gemacht... deswegen das new/delete.. aber wen man wirklich nur ne 0 an der best. stelle setzen muss dann ok^^
-
Speicherloch schrieb:
Wenn du bei einem allokierten sting abkürzt, in dem du einfach an einer bestimmten position ein 0 Zeichen setzt hast allokierten Datenmüll! Der Ansatz von Boris ist schon die richtigere Richtung!
Blödsinn! Man kann den Speicher benutzen wie man möchte, auch Nullen hineinschreiben usw. Und Boris hat ja nun wirklich keinen Schimmer
-
BorisDieKlinge schrieb:
void removeEnd(char *s,int n) { s= realloc(s,strlen(s)-n); }
Das wird ja immer schlimmer, du planloser Mensch
-
naja und wenn ich Nullen in bereich reinschreibe die mich nicht angehen?
muss der PC nicht wissen wo und wieviel speicher allokiert ist?
EDIT: Ochjö wie gemein^^
-
BorisDieKlinge schrieb:
void removeEnd(char *s,int n) { s= realloc(s,strlen(s)-n); }
EDIT: Hab in C schon ewig nichts mehr gemacht... deswegen das new/delete.. aber wen man wirklich nur ne 0 an der best. stelle setzen muss dann ok^^
Das wird genauso abschmieren wie deine new/delete Variante, wenn du die Funktion z.B. auf ein lokales char-Array loslässt.
@Speicherloch: Die Heap-Funktionen (malloc() und Co.) verwenden nicht die Stringende-Marken, um sich zu notieren, wie lang ein allokierter Block ist - die haben ihre eigenen Verwaltungsdaten. Und solange du da nichts zerstörst (Indexüberschreitungen o.ä.), ist es egal, was du mit dem Datenblock machst.
-
BitWax schrieb:
void CutEndOfString (char *lpString, int iCharsToCut) { int iStringLength = strlen (lpString); if (iStringLength < iCharsToCut) { strcpy (lpString, ""); return; } int iCutting = iStringLength - iCharsToCut; int i = iStringLength; while (i > iCutting) { lpString[i] = ' '; --i; } lpString[i] = '\0'; }
-
hmm ok verstehe
char *x= (char*)calloc(10,sizeof(char)); removeEnd(x,5); void removeEnd(char *&s,int n) { s= realloc(s,strlen(s)-n); }
wenn das so ausehen würde, würde ich dann nich 5 byte aufm heap freigeben, welcher später für andere gebraucht werden kann? Wenn ich das 5te elem auf \0 setze, sind trozdem noch die 10 bytes reserviert oder?
-
BitWax schrieb:
void CutEndOfString (char *lpString, int iCharsToCut) { int iStringLength = strlen (lpString); if (iStringLength < iCharsToCut) { strcpy (lpString, ""); return; } int iCutting = iStringLength - iCharsToCut; int i = iStringLength; while (i > iCutting) { lpString[i] = ' '; --i; } lpString[i] = '\0'; }
char *str = "hallo"; CutEndOfString (str, 3); // PENG :warning:
Auch schlecht
-
@Boris: Ja, sind sie - aber in deiner Funktion kannst du nicht feststellen, ob der übergebene String auf dem Heap liegt oder nicht:
char x[]="Hallo Welt"; removeEnd(x,5);//BUMM
@BitWix: Bei String-Literalen wird jeder Lösungsansatz scheitern
-
@BitWax / BitWitch: Wohl auch ein Griff ins Klo... wir wohl nichts mit dem Nobelpreis