Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Mid mit char*

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.07.2003, 20:27 Uhr
Oliver
S2-Pixelgeneral


Hallo,

kann mir jemand eine Funktion nennen, welche die Mid-Funktion von dem CString nachahmt?

Sie sollte so aussehen: ...(int begin,int count);

Gibts so was?

Ich hab mir versucht selber eine zu machen:


C++:
char*strmid(const char*str,const unsigned int &begin,const unsigned int &count)
{
    char*erg;
    erg=new char[count+1];
    for(unsigned int i =0;i<count;i++)
        erg[i] = str[i+begin];
    return erg;
}



Aber da werden bei new immer noch so paar komisch Zeichen drangehängt.
Wieso???
Könnt ihr mir das mal erklären, weil ich das nicht so richtig kapier.

Danke, Oli
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.07.2003, 22:24 Uhr
Pablo
Supertux
(Operator)


also, ich kenne zwar keine Funktion, aber

C++:
erg=new char[count+1];


ist definitiv falsch. Naja, es gab hier schon mal die Diskussion, ob es sowas möglich ist oder nicht. Heuzutage kann man ein Array mit eine nicht konstante Variable deklarieren. Es lässt sich kompilieren, aber frag nicht nach dem Ergebnis. Array lassen sich (hauptsächlich) von Zahlen oder von Konstanten deklarieren.


Code:
#define MAX_LINE 255
int main()
{
    char array1[255]; //richtig
    char array2[MAX_LINE]; // richtig
    int count = 9;
    char array3[count+1]; //falsch
}



Nimm nich new, denn dann musst du dieses Array mit delete explizit löschen.
Es wäre besser

C++:
char* fkt()
{
    static char erg[255];
    // hier tut irgendwas
    return erg;
}


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 10.07.2003 um 22:25 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.07.2003, 23:27 Uhr
ao

(Operator)



Zitat:
Oliver Müller postete
Aber da werden bei new immer noch so paar komisch Zeichen drangehängt.
Wieso???
Könnt ihr mir das mal erklären, weil ich das nicht so richtig kapier.


Hallo Oli,
ich hab die Funktion nicht getestet, aber im Prinzip erscheint sie mir richtig. Die komischen Zeichen am Ende kommen daher, daß Null-Zeichen am Ende nicht gesetzt wird. Ein String gehört hinter dem letzten Zeichen mit 0 abgeschlossen, also vor "return erg;" muß du noch

C++:
erg[count] = 0;


machen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.07.2003, 23:37 Uhr
ao

(Operator)


@Pablo: Was du da schreibst, stimmt nicht. Oli hat das Array nicht deklariert, sondern mit new alloziert, und die Längenangabe in new kann selbstverständlich ein Ausdruck mit Variablen sein.

Dein Vorschlag mit dem static-Array hat den großen Nachteil, daß bei zwei aufeinanderfolgenden Aufrufen von strmid() der zweite das Ergebnis des ersten überschreibt. Der Anwender muß wissen, daß er das Ergebnis kopieren muß - unpraktisch.

Delete kann man übersehen, auch nicht wirklich gut. Wenn ich keine String-Klasse mit eingebauter Aufräumfunktion verwenden kann, mache ich es immer so, daß der Aufrufer den Speicher anlegt und in die Funktion hineinreicht:

char * strmid (char * dest, const char * src, int len, int offset);

(es werden len Zeichen ab *(src + offset) nach dest kopiert. Der Rückgabewert ist auch dest. Der Aufrufer muß sicherstellen, daß bei dest genügend Speicher zur Verfügung steht. Das ist aber kein Problem, denn er kennt den Wert von len.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.07.2003, 23:46 Uhr
Pablo
Supertux
(Operator)


Da gebe ich mich geschlagen. Heißt dass, dass wenn ich ein Array mit new erzeuge, kann ich dann ne Variable Länge haben?

Stimmt, wenn man strmid() aufruft werden alle anderen überschrieben, daran habe ich nicht gedacht!

@Oli: Sorry für den falschen Tip.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.07.2003, 07:42 Uhr
virtual
Sexiest Bit alive
(Operator)


Zur Frage, wie man am besten die Rückgabewerte verdaut, gibt es bereits einen FAQ Eintrag
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.07.2003, 09:28 Uhr
ao

(Operator)



Zitat:
Pablo Yanez Trujillo postete
Heißt dass, dass wenn ich ein Array mit new erzeuge, kann ich dann ne Variable Länge haben?


Ja. Genau wie bei malloc().

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
11.07.2003, 10:56 Uhr
Oliver
S2-Pixelgeneral


Danke, der Tip mit dem 0 Byte am Ende war der Entscheidende, hab ich vergessen, weil ich lange nicht mehr mit new und char gearbeitet habe.
Werd mir wohl mal ne richtige große Stringklasse selber machen, damit ich das wieder lerne, danke für eure Hilfe
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
11.07.2003, 14:47 Uhr
~0xdeadbeef
Gast


Im Zweifel Standard-Algorithmen benutzen:

C++:
#include <algorithm>
#include <iostream>

int main() {
    char src[14]="Hello, World!";
    char target[7];

    std::copy(&src[7], &src[14], target);
    std::cout << target << std::endl;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
11.07.2003, 14:50 Uhr
~0xdeadbeef
Gast


Oder, wenn dus kapseln willst:

C++:
#include <algorithm>
char *strmid(char *src, char *target, int pos, int len) {
    std::copy(&src[pos], &src[pos+len-1], target);
    target[len] = 0;
    return target;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: