PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] String in einen String einfügen


Stone2001
2006-05-27, 20:04:50
Hallo zusammen,

ich habe folgendes Problem und zwar muß ich einen C-String (char*) in einen anderen C-String an einer bestimmten Position einfügen.

Kennt jemand von euch eine Lösung, die unter allen Umständen funktioniert?

Meine Lösung funktioniert nur, wenn sie gerade Lust dazu hat, manchmal kommen aber irgendwo Zeichen her, die die weitere Verarbeitung fast unmöglich machen. :(

Viele Grüße,

Stone

maximAL
2006-05-27, 21:06:24
code?
generell sollte das so funktionieren: die suchst die gewüschnte stelle im ziel-string und kopiert den quell-string mit strcpy dahin.
willst du die daten, die dort vorher standen retten (also den quell-string nur einhängen und nichts überschreiben lassen), dann wirst du wohl oder übel den restlichen ziel-string nach der einfüge stelle zwischenspeichern müssen und am ende wieder anhängen.
zudem darft du natürlich nicht vergessen, dass der ziel-string groß genug für die ganze aktion sein muss.

Stone2001
2006-05-27, 21:30:26
Wenn du meinen bisherigen Code haben willst, sollst du ihn haben.

void insertString (char* target, char* source, char* input, int pos)
{
strncpy(target, source, pos);
strcat(target, input);
source = source + pos;
strcat(target, source);
}

Wie gesagt, meistens funktioniert sie, nur manchmal nicht, dann treten reproduzierbar nach strncpy Zeichen auf, die da nicht hingehören sollten.

Naja, das Programm drumherum ist sowieso etwas buggy. Jede einzelne (Teil-)Funktion funktioniert, wie ich mir das Vorstelle. Füge ich alle Funktionen zusammen, dann steigt malloc sporadisch mal aus oder es gibt einen Seg-Fault oder Zeichen erscheinen, wo keine sein sollten.

Aber jetzt noch auf eine andere Sprache oder auf C++-Strings umzusteigen dürfte ein zu großer Aufwand sein. (das ist der letzte Notanker)

Lokadamus
2006-05-27, 22:01:03
mmm...

Ganz blöd gefragt, hast du an das Endzeichen gedacht? Wenn nein, sind die sinnlosen Zeichen, wenn sie am Ende oder dort, wo die Strings zusammengeführt werden (also zwischen String 1 und String 2), erscheinen, schnell erklärt.
Dann fehlt dir das Trennzeichen für das Stringende und du bekommst solange Zeichen ausgegeben, bis ein anderes Endzeichen auftaucht oder eine bestimmte Länge erreicht ist.
Mit strlen kannst du die Länge eines Stringes bestimmen, damit hab ich damals ein bischen rumgetestet und Strings sinnvoll bearbeitet.

Stone2001
2006-05-27, 22:13:24
Lokadamus[/POST]']mmm...

Ganz blöd gefragt, hast du an das Endzeichen gedacht?
Wird das nicht von strncpy automatisch angehängt?

EDIT: Scheinbar nicht. Laut http://www.cplusplus.com/ref/cstring/strncpy.html wird bei strncpy nicht automatisch ein \0 angehängt.

Oki, dann werde ich das morgen mal testen. Bleibt dann nur noch die Frage zu klären, warum es manchmal funktioniert und manchmal nicht. :|

Coda
2006-05-27, 23:02:23
Ist dein target-Buffer groß genug?

Stone2001
2006-05-27, 23:32:25
Sofern malloc richtig funktioniert... ;) Der Speicher für den Targetbuffer wird vor dem Aufruf der obigen Funktion erledigt (analog zu strcpy).

Coda
2006-05-28, 00:16:41
Hast auch ein Zeichen zusätzlich für \0 am Ende alloziert?
Du solltest nach dem ersten strncpy allerdings auch ne 0 reinschreiben ans Ende des bisherigen Strings, sonst kann strcat daneben liegen...

So etwa:
void insertString (char* target, char* source, char* input, int pos)
{
strncpy(target, source, pos);
target[pos] = 0;
strcat(target, input);
source = source + pos;
strcat(target, source);
}

Stone2001
2006-05-28, 11:27:24
Coda[/POST]']Hast auch ein Zeichen zusätzlich für \0 am Ende alloziert?
Yup, habe ich.
Coda[/POST]']
Du solltest nach dem ersten strncpy allerdings auch ne 0 reinschreiben ans Ende des bisherigen Strings, sonst kann strcat daneben liegen...

Das werde ich nachher mal testen.

Stone2001
2006-05-28, 16:17:18
Oki, super, wenigsten das funktioniert jetzt.

Jetzt muß ich nur noch das free() finden, dass mir immer die invalid pointer exceptions wirft.

Coda
2006-05-28, 16:26:38
Hast du keinen Debugger? :|

Stone2001
2006-05-28, 16:40:39
Coda[/POST]']Hast du keinen Debugger? :|
Ich sollte mich wohl so langsam mit dem gdb beschäftigen.

Naja, das Problem zur Zeit ist folgendes:
Funktion1 legt einen String per malloc an und gibt ihn als Rückgabewert an Funktion2. Funktion2 bearbeitet diesen String und möchte den Speicher dann nach Beendigung der Arbeit wieder mit free() freigeben. Es geht 20mal gut und dann gibt es eine invalid pointer exeception, aus heiterem Himmel.

Ich habe das free() jetzt mal entfernt und fange damit an meinen Speicher mit unzähligen Strings vollzumüllen, aber dafür funktioniert das Ganze jetzt.

Coda
2006-05-28, 17:17:16
Stone2001[/POST]']Ich sollte mich wohl so langsam mit dem gdb beschäftigen.
Dafür tuts im Zweifelsfall auch valgrind. Aber ich würde klar zu einer gescheiten IDE raten.

Windows oder Linux?

Stone2001
2006-05-28, 17:54:09
Coda[/POST]']Dafür tuts im Zweifelsfall auch valgrind. Aber ich würde klar zu einer gescheiten IDE raten.

Windows oder Linux?
In diesem Fall: Linux

Zur Zeit verwende ich Scite, falls du was besseres kennst ..., ich bin für alles offen.

Coda
2006-05-28, 18:26:12
Naja KDevelop oder Eclipse-CDT evtl. Hab ich aber noch nie den Debugger getestet bei beidem.

Aber ohne grafischen Debugger zu proggen finde ich heute schon etwas arg steinzeitlich.

Stone2001
2006-05-28, 19:15:57
Eclipse-CDT habe ich gerade mal ausprobiert. Nicht schlecht was CDT inzwischen so alles bietet, aber was muß ich ändern, damit Eclipse mein Projekt erstellt, sprich make aufruft?

Achill
2006-05-29, 10:31:26
Du wählst als Projekt: "Managed Make C bzw. C++"

Wenn du Verzeichnisse in den Kopilierungsprozess mit einbeziehen willst, muss man "Source Folder" als Verzeichnistyp hinzufügen ... hoffe das hilft weiter