Substring

Hallo,

ich steh gerade etwas auf dem Schlauch. Ich will aus einem String einen Substring herausholen. Und zwar unter Angabe der Arrayposition der gewünschten Character. Strncpy funktioniert nur vom Anfang des Strings.

Was ich brauche ist sowas wie: gib mir den Substring ab [3] bis [8] oder gib mir den Substring ab[3] fünf Character lang.

Ich weiß, das es sowas gibt, mir fällt es jetzt nur nicht ein.

Vielen Dank
Albert

Moin,

Was ich brauche ist sowas wie: gib mir den Substring ab [3]
bis [8] oder gib mir den Substring ab[3] fünf Character lang.

Ich weiß, das es sowas gibt, mir fällt es jetzt nur nicht ein.

strncpy(dest, src + start, laenge)
Auf die Schnelle, da gibt’s bestimmt noch ein paar Nebenwirkungen, die überprüft werden wollen.

Thorsten

Hi Albert :smile:

strncpy ( deststr, &sourcestr[n], m ) [m+n]= ‚\0‘;

Diese Anweisung schneidet dir aus dem sourcestr genau m Zeichen, beginnend bei dem n-ten Zeichen heraus und kopiert diese in deststr. Abschließend wird noch ein ‚\0‘-Zeichen als Stringende-Symbol gesetzt. In Meta-Code würde die obige Anweisung so aussehen:

deststr = sourcestr[n] bis sourcestr[n+m-1] plus ‚\0‘

cu Stefan.

Moin,

I am Jack’s smirking revenge.

strncpy ( deststr, &sourcestr[n], m ) [m+n]= ‚\0‘;

Worauf bezieht sich das „[m+n]= ‚\0‘;“? ‚deststr[n+m]‘ ist jedenfalls n bytes hinter dem Ende von deststr.

Thorsten

Hi Thorsten :smile:

I am Jack’s smirking revenge.

Hast du mein Friedensangebot noch nicht gelesen?

strncpy ( deststr, &sourcestr[n], m ) [m+n]= ‚\0‘;

Worauf bezieht sich das „[m+n]= ‚\0‘;“? ‚deststr[n+m]‘ ist
jedenfalls n bytes hinter dem Ende von deststr.

strncpy gibt einen Zeiger auf deststr zurück. Damit kannst du
„strncpy ( deststr, &sourcestr[n], m )“ auch durch „deststr“ ersetzen, so dass dann da steht:

deststr[m+n]= ‚\0‘

Das Nullbyte muss noch gesetzt werden, weil strncpy es nicht automatisch setzt.

Allerdings, sehe ich gerade, muss es tatsächlich heißen:

destsrt[m]= ‚\0‘.

Ähem, schon wieder einer dieser Flüchtigkeitsfehler. Das kommt durch den Schnupfen und meine dicke Birne :smile:)) Also, danke für deinen Hinweis. Es muss richtig heißen:

strncpy ( deststr, &sourcestr[n], m ) [m]= ‚\0‘

Ich muss mich bei solchen Grundlagen-Fragen einfach mehr konzentrieren. Ich gelobe Besserung :smile:))

cu Stefan.

Moin,

I am Jack’s smirking revenge.

Hast du mein Friedensangebot noch nicht gelesen?

Frieden? Befanden wir uns im Krieg? Das ist bloß ein Zitat aus einem Film, der mir sehr gut gefallen hat.

strncpy gibt einen Zeiger auf deststr zurück. Damit kannst du
„strncpy ( deststr, &sourcestr[n], m )“ auch durch „deststr“
ersetzen, so dass dann da steht:

deststr[m+n]= ‚\0‘

Stimmt. Verblüffend, wie schwer lesbar man C machen kann. Ich habe mal ein Programm zur Ermittlung von Primzahlen geschreiben, das ohne Vergleiche auskommt.

Ich muss mich bei solchen Grundlagen-Fragen einfach mehr
konzentrieren. Ich gelobe Besserung :smile:))

Ich empfehle http://www.amazon.de/exec/obidos/ASIN/0201604612, da wird genau diesen versteckten Fiesheiten von C auf den Grund gegangen.

Thorsten

Nabend,

danke Jungs, hat wunderbar geklappt.

Gruß
Albert

Hi,

Was ich brauche ist sowas wie: gib mir den Substring ab [3]
bis [8] oder gib mir den Substring ab[3] fünf Character lang.

Lol, also Stefan und T. Haude sind echt Klasse. Arbeitet Ihr fuer ne Sitcom? ;->

Nu aber an Albert:
Wenn Du C++ verwendest kannst Du Dir das ganze Zeug mit strcpy(str[x]…) sparen - ist nebenbei bemerkt eine ziemlich gefaehrliche Taktik. In C++ gibts in der STL die Klasse string und da die (ueberladene) Funktion string::substr(…).
Frag nochmal nach, wenns Dich interessiert.

Gruss

Thorsten

Hallo Stefan

strncpy ( deststr, &sourcestr[n], m ) [m]= ‚\0‘;

Diese Anweisung schneidet dir aus dem sourcestr genau m
Zeichen, beginnend bei dem n-ten Zeichen heraus und kopiert
diese in deststr. Abschließend wird noch ein ‚\0‘-Zeichen als
Stringende-Symbol gesetzt. In Meta-Code würde die obige

Achtung:
Wenn (n > strlen(sourcestr)) ist bekommst du „lustige“ Resultate !

if ( strlen(sourcestr)

Hi Peter :smile:

strncpy ( deststr, &sourcestr[n], m ) [m]= ‚\0‘;

Achtung:
Wenn (n > strlen(sourcestr)) ist bekommst du „lustige“
Resultate !

Ja, das ist klar! Du bekommst ähnlich lustige Resultate, wenn deststr oder sourcestr ins Nirgendwo zeigen oder wenn m zu groß ist :smile:)) Ich gehe mal davon aus, dass Albert diese Sonderfälle alle berücksichtigt. Es würde hier einfach zu lange dauern, alle trivialen Fehler abzufangen. Da krieg’ ich ja blutige Finger vom Tippen :smile:))

cu Stefan.

Hallo nochmal,

in C++ würde mich das auch interessieren (geht wohl mit CString) oder?

Was meinst Du denn mit gefährlich? Wenn ich die Zeigertypischen Probelme (wie in den anderen Postings beschrieben) abfange, ist es wohl o.k. oder? Und außerdem massiv schneller wie mit CString o. Ä.

Gruß
Albert

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Moin,

Lol, also Stefan und T. Haude sind echt Klasse. Arbeitet Ihr
fuer ne Sitcom? ;->

Es hat schon erste Anfragen von einem deutschen Fernsehsender gegeben, aber wir warten noch, was unser Agent in Hollywood erreichen kann. Auf jeden Fall werden wir demnächst prominenter Gäste im Container sein.

Thorsten

Das laß ich mal so im Raume stehen

Hi,

Was meinst Du denn mit gefährlich? Wenn ich die
Zeigertypischen Probelme (wie in den anderen Postings
beschrieben) abfange, ist es wohl o.k. oder?

Ja, genau darum geht es. Du faengst aber nicht immer und ueberall alle Probleme ab (oder Du gehoerst uz einer voellig neuen Hacker-Spezies).

Und außerdemmassiv schneller wie mit CString o. Ä.

  1. ist es in string (cstring sind die alten c string Funktionen)
  2. heisst es „schneller als wie CString“ :wink:
  3. Ja es mag ein bisserl schneller sein … na und? In 15 Monaten sind die Rechner schon wieder doppelt so schnell. Code wegen so eines Quatsches auf Geschwindigkeit zu optimieren ist die beste Strategie, Arbeitsplaetze fuer die Zukunft zu sichern (oder das Projekt zu killen) … oder ist das in Deinem Programm absolut kritisch?

Gruß

Thorsten

Hi,

Und außerdemmassiv schneller wie mit CString o. Ä.

  1. ist es in string (cstring sind die alten c string
    Funktionen)
  2. heisst es „schneller als wie CString“ :wink:

Ich komm halt aus dem gleichen Bundesland wie der Fußballspieler der wo früher beim VfB war und später bei Mailand gespielt hat und seine Karriere in den USA beendete:wink:

  1. Ja es mag ein bisserl schneller sein … na und? In 15
    Monaten sind die Rechner schon wieder doppelt so schnell. Code
    wegen so eines Quatsches auf Geschwindigkeit zu optimieren ist
    die beste Strategie, Arbeitsplaetze fuer die Zukunft zu
    sichern (oder das Projekt zu killen) … oder ist das in
    Deinem Programm absolut kritisch?

Meine Sache soll serverseitig laufen. Deshalb ist die Geschwindigkeit schon nicht ganz soo unwichtig. Prinzipiell geht es aber auch ums Prinzip:wink:

Wieso sind den heute alle Anwendungen doppelt und dreifach so groß wie früher (früher war eh alles besser…)??? Gerade weil sichs halt jeder leicht macht und MFC einsetzt, die halt einen Overhead produzieren. (Ich gehöre auch zu den Leuten) Schau Dir doch mal die Entwicklung bei MS an. Ich habe heute einen Pentium 3 mit 450 MHz auf dem Windows 2000 läuft. Obwohl mein Compi heute 10 mal schneller ist als meine erste 486 Kiste, war Word damals unter win 3 genauso schnell.

Aus Sicherheitsgründen kann ich Dir zwar schon zustimmen aber es muß ja nicht immer mit Gewalt objektorientiert sein.

Viele Grüße
Albert

Hi,

Meine Sache soll serverseitig laufen. Deshalb ist die
Geschwindigkeit schon nicht ganz soo unwichtig.

Na, da kann man dann ja schlecht was gegen sagen. Allerdings ist auf Server-Seite Stabilitaet mindestens genau so wichtig wie Geschwindigkeit.

Wieso sind den heute alle Anwendungen doppelt und dreifach so
groß wie früher (früher war eh alles besser…)??? Gerade weil
sichs halt jeder leicht macht und MFC einsetzt, die halt einen
Overhead produzieren.

Das dumme ist ja, dass das ganze Zeug in 20 Jahren vermutlich immer noch irgendwo rumfliegt - gerade, wenns eine Server-Anwendung ist. Und dann muessen sich wieder irgendwelche armen Schweine mit diesem C-Kauderwelsch rumschlagen, obwohl die Sprache dann lange obsolet ist - genau wie heute Cobol und Konsorten. Wann kommt eigentlich das Unix-Equivalent zum J2K-Bug? 30 Jahre? An die Leute, die das fixen muessen kannst Du ja schonmal ein paar nette Gruesse in die Kommentare packen :wink:

Dir doch mal die Entwicklung bei MS an. Ich habe heute einen
Pentium 3 mit 450 MHz auf dem Windows 2000 läuft. Obwohl mein
Compi heute 10 mal schneller ist als meine erste 486 Kiste,
war Word damals unter win 3 genauso schnell.

Das ist allerdings vermutlich weniger ein Problem von ineffektiver Programmierung als von Featuritis und Bunt-Und-Animiert-Philosophie. Wenn Du auf Deinem 486 eine Grammatik-Pruefung haettest laufen lassen wollen, waehrend eine Bueroklammer auf der Oberflaeche Chacha tanzt, haettest Du Dir vorher den Sommerurlaub nehmen koennen.

Aus Sicherheitsgründen kann ich Dir zwar schon zustimmen aber
es muß ja nicht immer mit Gewalt objektorientiert sein.

Objektorientierung ist etwas, das ALLEN Beteiligten das Leben erleichtert … und zwar signifikant. Wieso schreibst Du nicht in Assembler? Wenn Du das drauf hast, schlaegst Du jeden C-Kompiler um Laengen …

Gruss

Thorsten